Simon,

On Mon, 2008-05-26 at 17:01 +0800, simon.zheng at sun.com wrote:
> Laca,
> 
> Changed this to a bug fix for 
> ???http://bugzilla.gnome.org/show_bug.cgi?id=534335
> Calculation CPU load depend on two files kstat.h and sysinfo.h,
> especially sysinfo.h is different between Solaris and Linux. So I'm
> incline to use "#if defined(sun) && defined(__SVR4)"

Right.  For headers that exist on both Linux and Solaris but
are different, there's not much you can do.

> Actually we have pushed dozens of patches upstream. The remaining
> patches are partially Solaris-specific policy decision from PM team,
> partially not acceptable for gnome-2.22 branch but already in SVN trunk.
> Anyway, I'll try to push upstream as much as possible.

That's great.  If you have patches that are in the upsteam svn trunk
but there's no bugid, you can put "state:upstream" in the patch
comments to turn these patches green in the patch reports.
(If there is a bugid and the bug's status shows that it was
fixed, then the patch will be green anyway.)

Thanks,
Laca

> Thanks,
> -Simon
> 
> On Mon, 2008-05-19 at 21:42 +1200, Laszlo (Laca) Peter wrote:
> > Simon,
> > 
> > It's much nicer to look for kstat.h in configure and use
> > the HAVE_KSTAT_H macro instead of SOLARIS.  Did you make
> > any attempt to upstream all these gpm feature patches?
> > (although I would argue that this is a bug fix not a
> > feature).
> > 
> > Laca
> > 
> > On Mon, 2008-05-19 at 13:48 +0800, simon.zheng at sun.com wrote:
> > > --- src/Makefile.am.orig        2008-05-18 03:15:44.506112000 +0800
> > > +++ src/Makefile.am     2008-05-18 03:15:50.639100000 +0800
> > > @@ -118,6 +118,7 @@
> > >         $(GPM_EXTRA_LIBS)                               \
> > >         $(LOCAL_LIBHAL_LIBS)                            \
> > >         $(LOCAL_LIBDBUS_LIBS)                           \
> > > +       -lkstat                                         \
> > >         $(NULL)
> > >  
> > >  if HAVE_GTKUNIQUE
> > > @@ -218,6 +219,7 @@
> > >         $(GPM_EXTRA_LIBS)                               \
> > >         $(LOCAL_LIBHAL_LIBS)                            \
> > >         $(LOCAL_LIBDBUS_LIBS)                           \
> > > +       -lkstat                                         \
> > >         $(NULL)
> > >  
> > >  if HAVE_LIBNOTIFY
> > > @@ -297,6 +299,7 @@
> > >         $(LIBNOTIFY_LIBS)                               \
> > >         $(LOCAL_LIBDBUS_LIBS)                           \
> > >         $(LOCAL_LIBHAL_LIBS)                            \
> > > +       -lkstat                                         \
> > >         $(NULL)
> > >  
> > >  gnome_power_self_test_CPPFLAGS=        \
> > > --- src/gpm-load.c.org  2007-05-12 17:43:41.846780000 +0800
> > > +++ src/gpm-load.c      2007-05-12 17:43:46.035683000 +0800
> > > @@ -29,6 +29,10 @@
> > >  #include <string.h>
> > >  #include <sys/time.h>
> > >  #include <sys/types.h>
> > > +#ifdef SOLARIS
> > > +#include <kstat.h>
> > > +#include <sys/sysinfo.h>
> > > +#endif
> > >  #ifdef HAVE_UNISTD_H
> > >  #include <unistd.h>
> > >  #endif /* HAVE_UNISTD_H */
> > > @@ -75,6 +79,88 @@
> > >         g_type_class_add_private (klass, sizeof (GpmLoadPrivate));
> > >  }
> > >  
> > > +#ifdef SOLARIS
> > > +
> > > +/**
> > > + * gpm_load_get_cpu_values:
> > > + * @cpu_idle: The idle time reported by the CPU
> > > + * @cpu_total: The total time reported by the CPU
> > > + * Return value: Success of reading /proc/stat.
> > > + **/
> > > +static gboolean
> > > +gpm_load_get_cpu_values (long unsigned *cpu_idle, long unsigned
> > > *cpu_total)
> > > +{      
> > > +       long unsigned cpu_user = 0;
> > > +       long unsigned cpu_kernel = 0;
> > > +       long unsigned cpu_wait = 0;
> > > +       kstat_ctl_t *kc = NULL;
> > > +       kstat_named_t *kn = NULL;
> > > +       kstat_t     *ks = NULL;
> > > +       cpu_stat_t  data;
> > > +       int ncpus;
> > > +       int count;
> > > +               
> > > +       kc = kstat_open();
> > > +       if (!kc){
> > > +               gpm_warning ("Cannot open kstat!\n");
> > > +               return FALSE;
> > > +       }
> > > +
> > > +       ks = kstat_lookup(kc, "unix", 0, "system_misc");
> > > +       if (kstat_read(kc, ks, NULL) == -1) {
> > > +               gpm_warning ("Cannot read kstat on module unix!\n");
> > > +               goto out;
> > > +       }
> > > +       kn = kstat_data_lookup (ks, "ncpus");
> > > +       if (!kn) {
> > > +               gpm_warning ("Cannot get number of cpus in current
> > > system!\n");
> > > +               goto out;
> > > +       }
> > > +       ncpus = kn->value.ui32;
> > > +
> > > +       /* 
> > > +        * To aggresive ticks used of all cpus,
> > > +        * traverse kstat chain to access very cpu_stat instane.
> > > +        */
> > > +       for(count = 0, *cpu_idle =0, *cpu_total = 0; count < ncpus;
> > > count++){
> > > +               
> > > +               ks = kstat_lookup(kc, "cpu_stat", count, NULL);
> > > +               if (ks == NULL) {
> > > +                       gpm_warning ("Null output for kstat on cpu%d
> > > \n", count);
> > > +                       goto out;
> > > +               }
> > > +     
> > > +               if (kstat_read(kc, ks, &data) == -1) {
> > > +                       gpm_warning ("Cannot read kstat entry on cpu%d
> > > \n", count);
> > > +                       goto out;
> > > +               }
> > > +
> > > +               gpm_debug ("cpu%d:\t%lu\t%lu\t%lu\t%lu\n", count,
> > > +                                       data.cpu_sysinfo.cpu[CPU_IDLE],
> > > +                                       data.cpu_sysinfo.cpu[CPU_USER],
> > > +                                       data.cpu_sysinfo.cpu[CPU_KERNEL],
> > > +                                       data.cpu_sysinfo.cpu[CPU_WAIT]);
> > > +
> > > +               *cpu_idle += data.cpu_sysinfo.cpu[CPU_IDLE];
> > > +               cpu_user += data.cpu_sysinfo.cpu[CPU_USER];
> > > +               cpu_kernel += data.cpu_sysinfo.cpu[CPU_KERNEL];
> > > +               cpu_wait += data.cpu_sysinfo.cpu[CPU_WAIT];
> > > +       }
> > > +       kstat_close(kc);
> > > +       /*
> > > +         * Summing up all these times gives you the system uptime.
> > > +         * This is what the uptime command does.
> > > +         */
> > > +        *cpu_total = cpu_user + cpu_kernel + cpu_wait + *cpu_idle;
> > > +        return TRUE;
> > > +
> > > +out:
> > > +       kstat_close(kc);
> > > +       return FALSE;
> > > +}
> > > +
> > > +#else
> > > +
> > >  /**
> > >   * gpm_load_get_cpu_values:
> > >   * @cpu_idle: The idle time reported by the CPU
> > > @@ -108,6 +194,7 @@
> > >         *cpu_total = cpu_user + cpu_nice + cpu_system + *cpu_idle;
> > >         return TRUE;
> > >  }
> > > +#endif
> > >  
> > >  /**
> > >   * gpm_load_get_current:
> > > 
> > 


Reply via email to