Lee Revell wrote:
Check linux/timer.h. Here is the short version (from
Robert Love's
book):
struct timer_list my_timer;
[...]
Thanks for the explanation. Actually, this is what my patch uses right
now, so I'm glad I did it right after all. :) I did some more testing
under SuSE 9.1, and it appears that everything works ok now.
For those who want to try it out, I attached the entire corrected patch
(i.e., with expires set to jiffies+1) to this mail again.
Albert
--
Dr. Albert Gr"af
Dept. of Music-Informatics, University of Mainz, Germany
Email: Dr.Graef(a)t-online.de, ag(a)muwiinfa.geschichte.uni-mainz.de
WWW:
http://www.musikwissenschaft.uni-mainz.de/~ag
diff -ruN src.orig/linux/kernel/Makefile src/linux/kernel/Makefile
--- src.orig/linux/kernel/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ src/linux/kernel/Makefile 2004-07-25 12:01:03.000000000 +0200
@@ -0,0 +1,37 @@
+
+KERNEL_DIR := /lib/modules/$(shell uname -r)/build
+
+EXTRA_CFLAGS += -I$(obj)/../../common/Headers -D_LOOSE_KERNEL_NAMES -DMODVERSIONS
-D__Pentium__ -DCONFIG_KERNELD -DMODULE -D__KERNEL__ -DLINUX
+
+obj-m := midishare.o
+midishare-objs := msLoader.o MidiShareLinux.o MidiShare.o msConf.o \
+ msAlarms.o msAppls.o msConnx.o \
+ msFilter.o msMail.o msTasks.o msXmtRcv.o \
+ msHandler.o msInit.o msSmpte.o msTime.o \
+ msEvents.o msFields.o msMemory.o msSeq.o \
+ msSorter.o msDriver.o
+
+ifndef KERNELRELEASE
+
+C = Clients
+K = Kernel
+M = Memory
+S = Sorter
+D = Drivers
+
+COMMON := $(C)/msAlarms.c $(C)/msAppls.c $(C)/msConnx.c $(C)/msFilter.c \
+$(C)/msMail.c $(C)/msTasks.c $(C)/msXmtRcv.c \
+$(K)/msHandler.c $(K)/msInit.c $(K)/msSmpte.c $(K)/msTime.c \
+$(M)/msEvents.c $(M)/msFields.c $(M)/msMemory.c $(M)/msSeq.c \
+$(S)/msSorter.c $(D)/msDriver.c
+
+all:
+ for x in $(COMMON); do ln -sf ../../common/$$x `basename $$x`; done
+ $(MAKE) modules -C $(KERNEL_DIR) SUBDIRS=$(shell pwd)
+
+clean:
+ -rm -f *.ko *.o
+ -rm -f *.mod.* .*.cmd
+ -for x in $(COMMON); do rm -f `basename $$x`; done
+
+endif
diff -ruN src.orig/linux/kernel/MidiShare.c src/linux/kernel/MidiShare.c
--- src.orig/linux/kernel/MidiShare.c 2002-06-11 10:00:28.000000000 +0200
+++ src/linux/kernel/MidiShare.c 2004-07-25 12:08:01.373225440 +0200
@@ -27,7 +27,7 @@
*/
#ifdef MODVERSIONS
-#include <linux/modversions.h>
+#include <config/modversions.h>
#endif
#include <linux/kernel.h>
diff -ruN src.orig/linux/kernel/MidiShareLinux.c src/linux/kernel/MidiShareLinux.c
--- src.orig/linux/kernel/MidiShareLinux.c 2004-07-22 23:36:29.000000000 +0200
+++ src/linux/kernel/MidiShareLinux.c 2004-07-25 12:08:01.374225288 +0200
@@ -28,7 +28,7 @@
*/
#ifdef MODVERSIONS
-#include <linux/modversions.h>
+#include <config/modversions.h>
#endif
/* centralizing compatibility issues between 2.0, 2.2, 2.4 */
@@ -64,6 +64,8 @@
#include <linux/slab.h>
#include <linux/poll.h>
+#include <asm/param.h>
+#include <linux/timer.h>
#include "msLoader.h"
#include "msExtern.h"
@@ -76,7 +78,7 @@
/*_______________________________________________________________________*/
typedef struct TMachine {
- struct tq_struct timerTask; /* timer task */
+ struct timer_list timerTask; /* timer task */
NEW_WAIT_QUEUE stopQueue; /* stop queue (for cleanup_module ) */
struct timeval time; /* for timer management */
long phase; /* used to count ClockHandler calls */
@@ -92,7 +94,7 @@
} LinuxContext, * LinuxContextPtr;
-static void TimerTask(void * arg);
+static void TimerTask(unsigned long arg);
/*
The machine structure (TLinux structure) is globally allocated so that the TimerTask
@@ -316,12 +318,10 @@
static void InitMachine (TLinuxPtr machine)
{
- #ifndef LINUX_24
- machine->timerTask.next = NULL; /* Next item in list - queue_task will do this for
us */
- #endif
- machine->timerTask.sync = 0; /* A flag meaning we haven't been inserted into
a task queue yet */
- machine->timerTask.routine = TimerTask; /* The function to run */
- machine->timerTask.data = gMem; /* the arg parameter to the interrupt
routine : the MidiShare global data */
+ //printk("midishare: initializing\n");
+ init_timer(&machine->timerTask);
+ machine->timerTask.data = (unsigned long)gMem;
+ machine->timerTask.function = TimerTask;
INIT_WAIT_QUEUE(machine->stopQueue);
machine->phase = 0;
machine->status = true;
@@ -336,7 +336,7 @@
to take into account that HZ may not be a divider of 1000 or
can even be greater than 1000 hz.
*/
-static void TimerTask(void * arg)
+static void TimerTask(unsigned long arg)
{
TMSGlobalPtr g = (TMSGlobalPtr) arg;
TLinuxPtr machine = (TLinuxPtr) g->local;
@@ -347,7 +347,8 @@
long i = machine->phase;
while (i<1000) { ClockHandler(g); i+=HZ; }
machine->phase = i-1000;
- queue_task(&machine->timerTask, &tq_timer);
+ machine->timerTask.expires = jiffies+1;
+ add_timer(&machine->timerTask);
}
}
@@ -369,8 +370,10 @@
void OpenTimeInterrupts (TMSGlobalPtr g)
{
TLinuxPtr machine = (TLinuxPtr) g->local;
+ //printk("midishare: waking up\n");
do_gettimeofday(&machine->time);
- queue_task(&machine->timerTask, &tq_timer);
+ machine->timerTask.expires = jiffies+1;
+ add_timer(&machine->timerTask);
}
/*__________________________________________________________________________*/
@@ -378,6 +381,7 @@
void CloseTimeInterrupts(TMSGlobalPtr g)
{
TLinuxPtr machine = (TLinuxPtr) g->local;
+ //printk("midishare: sleeping\n");
machine->status = false;
interruptible_sleep_on(&machine->stopQueue);
}
diff -ruN src.orig/linux/kernel/msConf.c src/linux/kernel/msConf.c
--- src.orig/linux/kernel/msConf.c 2002-07-22 13:07:31.000000000 +0200
+++ src/linux/kernel/msConf.c 2004-07-25 12:08:01.374225288 +0200
@@ -22,7 +22,7 @@
#ifdef MODULE
#ifdef MODVERSIONS
-# include <linux/modversions.h>
+# include <config/modversions.h>
#endif
#define malloc(size) kmalloc(size, GFP_KERNEL)
#define free kfree
@@ -32,6 +32,7 @@
#include <linux/kernel.h>
#include <linux/slab.h>
#include <asm/current.h>
+#include <linux/sched.h>
#include <asm/string.h>
#include "msConf.h"
@@ -193,17 +194,17 @@
static char read_char (fileptr fd)
{
long l; ssize_t n; char *c = (char *)&l;
- long savedLimit = get_current()->addr_limit.seg;
- get_current()->addr_limit.seg = 0xffffffff;
+ long savedLimit = current_thread_info()->addr_limit.seg;
+ current_thread_info()->addr_limit.seg = 0xffffffff;
do {
n = generic_file_read (fd, c, 1, &(fd->f_pos));
if (n <= 0) {
- get_current()->addr_limit.seg = savedLimit;
+ current_thread_info()->addr_limit.seg = savedLimit;
return EOF;
}
} while ((*c == ' ') || (*c == '\t'));
- get_current()->addr_limit.seg = savedLimit;
+ current_thread_info()->addr_limit.seg = savedLimit;
return *c;
}
diff -ruN src.orig/linux/kernel/msLoader.c src/linux/kernel/msLoader.c
--- src.orig/linux/kernel/msLoader.c 2003-02-04 17:16:22.000000000 +0100
+++ src/linux/kernel/msLoader.c 2004-07-25 12:08:01.375225136 +0200
@@ -35,7 +35,7 @@
#ifdef MODULE
# ifdef MODVERSIONS
-# include <linux/modversions.h>
+# include <config/modversions.h>
# endif
#define EXPORT_SYMTAB
#include <linux/module.h>
@@ -81,8 +81,8 @@
while (s[n]) n++; /* longueur de s */
if (dst != NULL) {
- (* dst->driver.write)(dst, 0, s, n);
- (* dst->driver.write)(dst, 0, "\015\012", 2);
+ (* dst->driver->write)(dst, 0, s, n);
+ (* dst->driver->write)(dst, 0, "\015\012", 2);
}
}
@@ -127,7 +127,7 @@
int n = MSCountAppls(Clients(gMem));
while (n){
- MOD_DEC_USE_COUNT;
+ //MOD_DEC_USE_COUNT;
MSClose( MSGetIndAppl(n--,Clients(gMem)),gMem);
}
@@ -138,7 +138,7 @@
static int myopen(struct inode *inode, struct file * f)
{
- MOD_INC_USE_COUNT;
+ //MOD_INC_USE_COUNT;
return 0; /* 0 = OK, tout va bien */
}
@@ -147,7 +147,7 @@
static int myclose(struct inode *inode, struct file * f)
{
mskCloseAll(f);
- MOD_DEC_USE_COUNT;
+ //MOD_DEC_USE_COUNT;
return 0;
}
diff -ruN src.orig/linux/kernel/msLoader.h src/linux/kernel/msLoader.h
--- src.orig/linux/kernel/msLoader.h 2001-06-22 18:48:42.000000000 +0200
+++ src/linux/kernel/msLoader.h 2004-07-25 12:08:01.375225136 +0200
@@ -31,6 +31,8 @@
/* functions prototypes */
+struct file;
+
int mskGetVersion(unsigned long userptr,struct file *);
int mskCountAppls(unsigned long userptr,struct file *);
int mskGetIndAppl(unsigned long userptr,struct file *);
diff -ruN src.orig/linux/makefile src/linux/makefile
--- src.orig/linux/makefile 2003-02-04 16:54:19.000000000 +0100
+++ src/linux/makefile 2004-07-25 11:46:42.000000000 +0200
@@ -11,7 +11,7 @@
make -f appls
kernel: common
- make -C kernel
+ make -C kernel -f Makefile
common:
make -C ../common
@@ -20,32 +20,32 @@
install: libinstall clientsinstall
[ -d $(MODF) ] || mkdir $(MODF)
- install MidiShare.o $(MODF)
+ install -m 644 kernel/midishare.ko $(MODF)
/sbin/depmod -a
install MidiShare $(RC)/init.d
ln -s $(INIT)/MidiShare $(RC)/rc5.d/S90MidiShare
ln -s $(INIT)/MidiShare $(RC)/rc3.d/S90MidiShare
- /sbin/modprobe MidiShare
+ /sbin/modprobe midishare
uninstall: libuninstall clientsuninstall
rm -f /etc/$(CONF)
- rm -f $(MODF)/MidiShare.o
+ rm -f $(MODF)/midishare.ko
rm -f $(INIT)/MidiShare $(RC)/rc[35].d/*MidiShare
- /sbin/rmmod MidiShare
-
+ /sbin/rmmod midishare
+
clean:
make -i -C ../common/Memory clean
make -i -C ../common clean
- make -i -C kernel clean
+ make -i -C kernel clean -f Makefile
make -i -C library clean
make -f appls clean
#Compile applications, tools and drivers
-
+
clients:
make -f appls
-
+
#Install applications, tools and drivers
clientsinstall:
@@ -68,14 +68,14 @@
cp $(CONF) /etc/$(CONF)
[ -d $(INCF) ] || mkdir $(INCF)
install Include/MidiShare.h $(INCF)
-
+
test:
make -C tests all
-
+
driver:
make -C drivers all
-
+
dep:
make -i -C ../common/Memory dep
make -i -C ../common dep
diff -ruN src.orig/linux/MidiShare src/linux/MidiShare
--- src.orig/linux/MidiShare 2000-07-19 18:08:05.000000000 +0200
+++ src/linux/MidiShare 2004-07-25 12:08:01.376224984 +0200
@@ -24,23 +24,23 @@
case "$1" in
start)
# Check if MidiShare is already installed
- lsmod | grep MidiShare >/dev/null
+ lsmod | grep midishare >/dev/null
if [ ! $? ]; then
echo MidiShare module is still installed
else
echo -n Loading MidiShare module
- modprobe MidiShare 2>/dev/null
+ modprobe midishare 2>/dev/null
result
fi
;;
stop)
# Check if MidiShare is already installed
- lsmod | grep MidiShare >/dev/null
+ lsmod | grep midishare >/dev/null
if [ $? ]; then
echo MidiShare module is not installed
else
echo -n Removing MidiShare module
- rmmod MidiShare 2>/dev/null
+ rmmod midishare 2>/dev/null
result
fi
;;