more ifdef's to make it work with Red Hat Enterprise Linux 4's 2.6.9-based
authorBastien Nocera <hadess@hadess.net>
Fri, 17 Feb 2006 15:44:55 +0000 (15:44 +0000)
committerBastien Nocera <hadess@src.gnome.org>
Fri, 17 Feb 2006 15:44:55 +0000 (15:44 +0000)
2006-02-17  Bastien Nocera  <hadess@hadess.net>

* configure.ac:
* module/sysprof-module.c: (timer_notify), (sysprof_open),
(sysprof_release): more ifdef's to make it work with Red Hat
Enterprise Linux 4's 2.6.9-based kernel

ChangeLog
configure.ac
module/sysprof-module.c

index c442614..2316d32 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-02-17  Bastien Nocera  <hadess@hadess.net>
+
+       * configure.ac:
+       * module/sysprof-module.c: (timer_notify), (sysprof_open),
+       (sysprof_release): more ifdef's to make it work with Red Hat
+       Enterprise Linux 4's 2.6.9-based kernel
+
 Sat Feb  4 23:53:05 2006  Søren Sandmann  <sandmann@redhat.com>
 
        * sysprof.glade: Remove ancestors pane in favor of radiobuttons in
index 6523b08..f1998d7 100644 (file)
@@ -61,9 +61,9 @@ if test $kernel_module = "yes"; then
   KMINOR=`uname -r | cut -d"." -f 2`
   KMICRO=`uname -r | cut -d"." -f 3 | cut -d"-" -f 1`
 
-  if [[ $KMICRO -lt 11 ]] ; then
+  if [[ $KMICRO -lt 9 ]] ; then
      echo \*
-     echo \* Linux \>= 2.6.11 is required
+     echo \* Linux \>= 2.6.9 is required
      echo \*
      exit 1
   fi
index e0dff7f..d3ef07a 100644 (file)
 #include "sysprof-module.h"
 
 #include <linux/version.h>
-#if (KERNEL_VERSION(2,6,11) > LINUX_VERSION_CODE) || (!CONFIG_PROFILING)
-# error Sysprof needs a Linux 2.6.11 kernel or later, with profiling support compiled in.
+#if (KERNEL_VERSION(2,6,9) > LINUX_VERSION_CODE) || (!CONFIG_PROFILING)
+# error Sysprof needs a Linux 2.6.9 kernel or later, with profiling support compiled in.
 #endif
+
+#if (KERNEL_VERSION(2,6,11) > LINUX_VERSION_CODE)
+#define OLD_PROFILE
+#include <linux/notifier.h>
+#endif
+
 #include <linux/kallsyms.h>
 
 MODULE_LICENSE("GPL");
@@ -101,9 +107,16 @@ read_frame (void *frame_pointer, StackFrame *frame)
        return 0;
 }
 
+#ifdef OLD_PROFILE
+static int timer_notify(struct notifier_block * self, unsigned long val, void * data)
+#else
 static int
 timer_notify (struct pt_regs *regs)
+#endif
 {
+#ifdef OLD_PROFILE
+       struct pt_regs * regs = (struct pt_regs *)data;
+#endif
        void *frame_pointer;
        static int n_samples;
        SysprofStackTrace *trace = head;
@@ -161,6 +174,14 @@ timer_notify (struct pt_regs *regs)
        return 0;
 }
 
+#ifdef OLD_PROFILE
+static struct notifier_block timer_notifier = {
+       .notifier_call  = timer_notify,
+       NULL,
+       0
+};
+#endif
+
 static int
 sysprof_read(struct file *file, char *buffer, size_t count, loff_t *offset)
 {
@@ -208,8 +229,13 @@ sysprof_open(struct inode *inode, struct file *file)
 {
        int retval = 0;
 
-       if (atomic_inc_return(&client_count) == 1)
+       if (atomic_inc_return(&client_count) == 1) {
+#ifndef OLD_PROFILE
                retval = register_timer_hook (timer_notify);
+#else
+               retval = register_profile_notifier (&timer_notifier);
+#endif
+       }
 
        file->private_data = head;
        
@@ -219,8 +245,13 @@ sysprof_open(struct inode *inode, struct file *file)
 static int
 sysprof_release(struct inode *inode, struct file *file)
 {
-       if (atomic_dec_return(&client_count) == 0)
+       if (atomic_dec_return(&client_count) == 0) {
+#ifndef OLD_PROFILE
                unregister_timer_hook (timer_notify);
+#else
+               unregister_profile_notifier (&timer_notifier);
+#endif
+       }
        
        return 0;
 }