sigar 0.7.2 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'rubygems'
2
- require 'rake/gempackagetask'
2
+ require 'rubygems/package_task'
3
3
  require 'rake/testtask'
4
4
 
5
5
  #so we can: ssh host rake -f $hudson_workspace/sigar/Rakefile
@@ -22,7 +22,7 @@ spec = Gem::Specification.new do |s|
22
22
  s.name = GEM
23
23
  # s.version = props['version.major'] + '.' + props['version.minor'] + '.' + props['version.maint']
24
24
  # '0.7.x' until the sigar-1.7.0 release
25
- s.version = '0' + '.' + props['version.minor'] + '.' + '2'
25
+ s.version = '0' + '.' + props['version.minor'] + '.' + '3'
26
26
  s.summary = props['project.summary']
27
27
  s.description = s.summary
28
28
  s.author = props['project.author']
@@ -34,13 +34,13 @@ spec = Gem::Specification.new do |s|
34
34
  s.files =
35
35
  %w(LICENSE NOTICE README Rakefile version.properties) +
36
36
  %w(bindings/SigarWrapper.pm bindings/SigarBuild.pm) +
37
- `git ls-files -- bindings/ruby/*`.split("\n") +
37
+ `git ls-files -- bindings/ruby/*.*`.split("\n") +
38
38
  Dir.glob("include/*.h") +
39
39
  Dir.glob("src/**/*.[ch]") +
40
40
  Dir.glob("src/**/*.in")
41
41
  end
42
42
 
43
- Rake::GemPackageTask.new(spec) do |pkg|
43
+ Gem::PackageTask.new(spec) do |pkg|
44
44
  pkg.gem_spec = spec
45
45
  end
46
46
 
@@ -43,6 +43,7 @@ my %has_name_arg = map { $_, 1 } qw(FileSystemUsage DiskUsage
43
43
  FileAttrs DirStat DirUsage
44
44
  NetInterfaceConfig NetInterfaceStat);
45
45
 
46
+
46
47
  my %proc_no_arg = map { $_, 1 } qw(stat);
47
48
 
48
49
  my %get_not_impl = map { $_, 1 } qw(net_address net_route net_connection net_stat cpu_perc
@@ -527,6 +528,7 @@ use vars qw(%classes %cmds);
527
528
  plat => '*'
528
529
  },
529
530
  ],
531
+
530
532
  ProcMem => [
531
533
  {
532
534
  name => 'size', type => 'Long',
@@ -627,6 +629,51 @@ use vars qw(%classes %cmds);
627
629
  plat => '*'
628
630
  },
629
631
  ],
632
+ ProcDiskIO => [
633
+ {
634
+ name => 'bytes_read', type => 'Long',
635
+ desc => 'Bytes Read',
636
+ plat => 'LW'
637
+ },
638
+ {
639
+ name => 'bytes_written', type => 'Long',
640
+ desc => 'Bytes Written',
641
+ plat => 'LW'
642
+ },
643
+ {
644
+ name => 'bytes_total', type => 'Long',
645
+ desc => 'Bytes Total',
646
+ plat => 'LWAHS'
647
+ }
648
+ ],
649
+
650
+ ProcCumulativeDiskIO => [
651
+ {
652
+ name => 'bytes_read', type => 'Long',
653
+ desc => 'Bytes Read from Start',
654
+ plat => 'LW'
655
+ },
656
+ {
657
+ name => 'bytes_written', type => 'Long',
658
+ desc => 'Bytes Written from Start',
659
+ plat => 'LW'
660
+ },
661
+ {
662
+ name => 'bytes_total', type => 'Long',
663
+ desc => 'Bytes Total from Start',
664
+ plat => 'LWAHS'
665
+ }
666
+ ],
667
+
668
+ DumpPidCache => [
669
+ {
670
+ name => 'dummy', type => 'Long',
671
+ desc => 'Dummy',
672
+ plat => 'LWAHS'
673
+ }
674
+ ],
675
+
676
+
630
677
  ProcState => [
631
678
  {
632
679
  name => 'state', type => 'Char',
@@ -292,6 +292,47 @@ typedef struct {
292
292
  SIGAR_DECLARE(int) sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
293
293
  sigar_proc_mem_t *procmem);
294
294
 
295
+ typedef struct {
296
+ sigar_uint64_t
297
+ bytes_read,
298
+ bytes_written,
299
+ bytes_total;
300
+ } sigar_proc_disk_io_t;
301
+
302
+ SIGAR_DECLARE(int) sigar_proc_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
303
+ sigar_proc_disk_io_t *proc_disk_io);
304
+
305
+ typedef struct {
306
+ sigar_uint64_t
307
+ bytes_read,
308
+ bytes_written,
309
+ bytes_total;
310
+ sigar_uint64_t last_time;
311
+ sigar_uint64_t
312
+ bytes_read_diff,
313
+ bytes_written_diff,
314
+ bytes_total_diff;
315
+ } sigar_cached_proc_disk_io_t;
316
+
317
+
318
+ typedef struct {
319
+ sigar_uint64_t
320
+ bytes_read,
321
+ bytes_written,
322
+ bytes_total;
323
+ } sigar_proc_cumulative_disk_io_t;
324
+
325
+ SIGAR_DECLARE(int) sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
326
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io);
327
+
328
+
329
+ typedef struct {
330
+ sigar_uint64_t dummy;
331
+ }sigar_dump_pid_cache_t;
332
+
333
+ SIGAR_DECLARE(int) sigar_dump_pid_cache_get(sigar_t *sigar, sigar_dump_pid_cache_t *info);
334
+
335
+
295
336
  typedef struct {
296
337
  sigar_uid_t uid;
297
338
  sigar_gid_t gid;
@@ -68,7 +68,8 @@
68
68
  sigar_cache_t *proc_cpu; \
69
69
  sigar_cache_t *net_listen; \
70
70
  sigar_cache_t *net_services_tcp; \
71
- sigar_cache_t *net_services_udp
71
+ sigar_cache_t *net_services_udp;\
72
+ sigar_cache_t *proc_io
72
73
 
73
74
  #if defined(WIN32)
74
75
  # define SIGAR_INLINE __inline
@@ -398,11 +399,15 @@ int sigar_get_iftype(const char *name, int *type, int *inst);
398
399
  #define SIGAR_NIC_SIT "IPv6-in-IPv4"
399
400
  #define SIGAR_NIC_IRDA "IrLAP"
400
401
  #define SIGAR_NIC_EC "Econet"
401
-
402
+ #define PID_CACHE_CLEANUP_PERIOD 1000*60*10 /* 10 minutes */
403
+ #define PID_CACHE_ENTRY_EXPIRE_PERIOD 1000*60*20 /* 20 minutes */
402
404
  #ifndef WIN32
403
405
  #include <netdb.h>
404
406
  #endif
405
407
 
408
+ #define PROC_PID_CPU_CACHE 1
409
+ #define PROC_PID_IO_CACHE 2
410
+
406
411
  #define SIGAR_HOSTENT_LEN 1024
407
412
  #if defined(_AIX)
408
413
  #define SIGAR_HAS_HOSTENT_DATA
@@ -170,15 +170,21 @@ struct sigar_cache_entry_t {
170
170
  sigar_cache_entry_t *next;
171
171
  sigar_uint64_t id;
172
172
  void *value;
173
+ sigar_uint64_t last_access_time;
173
174
  };
174
175
 
175
176
  typedef struct {
176
177
  sigar_cache_entry_t **entries;
177
178
  unsigned int count, size;
178
179
  void (*free_value)(void *ptr);
180
+ sigar_uint64_t entry_expire_period;
181
+ sigar_uint64_t cleanup_period_millis;
182
+ sigar_uint64_t last_cleanup_time;
179
183
  } sigar_cache_t;
180
184
 
181
185
  sigar_cache_t *sigar_cache_new(int size);
186
+ sigar_cache_t *sigar_expired_cache_new(int size, sigar_uint64_t cleanup_period_millis, sigar_uint64_t entry_expire_period);
187
+ void sigar_cache_dump(sigar_cache_t *table);
182
188
 
183
189
  sigar_cache_entry_t *sigar_cache_get(sigar_cache_t *table,
184
190
  sigar_uint64_t key);
@@ -754,6 +754,23 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
754
754
  return SIGAR_OK;
755
755
  }
756
756
 
757
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
758
+ sigar_proc_cumulative_disk_io_t *cumulative_proc_disk_io)
759
+ {
760
+ int status = sigar_getprocs(sigar, pid);
761
+ struct procsinfo64 *pinfo = sigar->pinfo;
762
+
763
+ if (status != SIGAR_OK) {
764
+ return status;
765
+ }
766
+ cumulative_proc_disk_io->bytes_read = SIGAR_FIELD_NOTIMPL;
767
+ cumulative_proc_disk_io->bytes_written = SIGAR_FIELD_NOTIMPL;
768
+ cumulative_proc_disk_io->bytes_total = pinfo->pi_ioch;
769
+
770
+ return SIGAR_OK;
771
+ }
772
+
773
+
757
774
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
758
775
  sigar_proc_cred_t *proccred)
759
776
  {
@@ -16,11 +16,6 @@
16
16
  * limitations under the License.
17
17
  */
18
18
 
19
- #include "sigar.h"
20
- #include "sigar_private.h"
21
- #include "sigar_util.h"
22
- #include "sigar_os.h"
23
-
24
19
  #include <sys/param.h>
25
20
  #include <sys/mount.h>
26
21
  #if !(defined(__FreeBSD__) && (__FreeBSD_version >= 800000))
@@ -66,14 +61,6 @@
66
61
  #include <stdio.h>
67
62
  #endif
68
63
 
69
- #if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
70
- #define SIGAR_FREEBSD5_NFSSTAT
71
- #include <nfsclient/nfs.h>
72
- #include <nfsserver/nfs.h>
73
- #else
74
- #include <nfs/nfs.h>
75
- #endif
76
-
77
64
  #include <sys/ioctl.h>
78
65
  #include <sys/mount.h>
79
66
  #include <sys/resource.h>
@@ -88,6 +75,14 @@
88
75
  #include <netinet/in.h>
89
76
  #include <netinet/if_ether.h>
90
77
 
78
+ #if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
79
+ #define SIGAR_FREEBSD5_NFSSTAT
80
+ #include <nfsclient/nfs.h>
81
+ #include <nfsserver/nfs.h>
82
+ #else
83
+ #include <nfs/nfs.h>
84
+ #endif
85
+
91
86
  #include <dirent.h>
92
87
  #include <errno.h>
93
88
 
@@ -112,6 +107,11 @@
112
107
  #include <netinet/tcp_var.h>
113
108
  #include <netinet/tcp_fsm.h>
114
109
 
110
+ #include "sigar.h"
111
+ #include "sigar_private.h"
112
+ #include "sigar_util.h"
113
+ #include "sigar_os.h"
114
+
115
115
  #define NMIB(mib) (sizeof(mib)/sizeof(mib[0]))
116
116
 
117
117
  #ifdef __FreeBSD__
@@ -1241,6 +1241,13 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
1241
1241
  return SIGAR_OK;
1242
1242
  }
1243
1243
 
1244
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
1245
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
1246
+ {
1247
+ return SIGAR_ENOTIMPL;
1248
+ }
1249
+
1250
+
1244
1251
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
1245
1252
  sigar_proc_cred_t *proccred)
1246
1253
  {
@@ -307,6 +307,25 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
307
307
  return SIGAR_OK;
308
308
  }
309
309
 
310
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
311
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
312
+ {
313
+
314
+ int status = sigar_pstat_getproc(sigar, pid);
315
+ struct pst_status *pinfo = sigar->pinfo;
316
+
317
+ if (status != SIGAR_OK) {
318
+ return status;
319
+ }
320
+ proc_cumulative_disk_io->bytes_read = SIGAR_FIELD_NOTIMPL;
321
+ proc_cumulative_disk_io->bytes_written = SIGAR_FIELD_NOTIMPL;
322
+ proc_cumulative_disk_io->bytes_total = pinfo->pst_ioch;
323
+
324
+
325
+ return SIGAR_OK;
326
+ }
327
+
328
+
310
329
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
311
330
  sigar_proc_cred_t *proccred)
312
331
  {
@@ -768,6 +768,34 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
768
768
  return SIGAR_OK;
769
769
  }
770
770
 
771
+ SIGAR_INLINE sigar_uint64_t get_named_proc_token(char *buffer,
772
+ char *token) {
773
+ char *ptr = strstr(buffer, token);
774
+ if (!ptr) {
775
+ return SIGAR_FIELD_NOTIMPL;
776
+ }
777
+ ptr = sigar_skip_token(ptr);
778
+ return sigar_strtoul(ptr);
779
+ }
780
+
781
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
782
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
783
+ {
784
+ char buffer[BUFSIZ];
785
+
786
+ int status = SIGAR_PROC_FILE2STR(buffer, pid, "/io");
787
+
788
+ if (status != SIGAR_OK) {
789
+ return status;
790
+ }
791
+
792
+ proc_cumulative_disk_io->bytes_read = get_named_proc_token(buffer, "\nread_bytes");
793
+ proc_cumulative_disk_io->bytes_written = get_named_proc_token(buffer, "\nwrite_bytes");
794
+ proc_cumulative_disk_io->bytes_total = proc_cumulative_disk_io->bytes_read + proc_cumulative_disk_io->bytes_written;
795
+
796
+ return SIGAR_OK;
797
+ }
798
+
771
799
  #define NO_ID_MSG "[proc_cred] /proc/%lu" PROC_PSTATUS " missing "
772
800
 
773
801
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
@@ -407,7 +407,7 @@ int sigar_cpu_get(sigar_t *sigar, sigar_cpu_t *cpu)
407
407
  cpu->idle += xcpu->idle;
408
408
  cpu->nice += xcpu->nice;
409
409
  cpu->wait += xcpu->wait;
410
- cpu->total = xcpu->total;
410
+ cpu->total += xcpu->total;
411
411
  }
412
412
 
413
413
  return SIGAR_OK;
@@ -719,6 +719,21 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
719
719
  return SIGAR_OK;
720
720
  }
721
721
 
722
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
723
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
724
+ {
725
+ prusage_t usage;
726
+ int status;
727
+ if ((status = sigar_proc_usage_get(sigar, &usage, pid)) != SIGAR_OK) {
728
+ return status;
729
+ }
730
+ proc_cumulative_disk_io->bytes_read = SIGAR_FIELD_NOTIMPL;
731
+ proc_cumulative_disk_io->bytes_written = SIGAR_FIELD_NOTIMPL;
732
+ proc_cumulative_disk_io->bytes_total = usage.pr_ioch;
733
+
734
+ return SIGAR_OK;
735
+ }
736
+
722
737
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
723
738
  sigar_proc_cred_t *proccred)
724
739
  {
@@ -345,6 +345,8 @@ typedef struct {
345
345
  sigar_uint64_t handles;
346
346
  sigar_uint64_t threads;
347
347
  sigar_uint64_t page_faults;
348
+ sigar_uint64_t bytes_read;
349
+ sigar_uint64_t bytes_written;
348
350
  } sigar_win32_pinfo_t;
349
351
 
350
352
  typedef struct {
@@ -62,6 +62,8 @@ typedef enum {
62
62
  #define PERF_TITLE_PPID 1410
63
63
  #define PERF_TITLE_PRIORITY 682
64
64
  #define PERF_TITLE_START_TIME 684
65
+ #define PERF_TITLE_IO_READ_BYTES_SEC 1420
66
+ #define PERF_TITLE_IO_WRITE_BYTES_SEC 1422
65
67
 
66
68
  typedef enum {
67
69
  PERF_IX_CPUTIME,
@@ -74,6 +76,8 @@ typedef enum {
74
76
  PERF_IX_PPID,
75
77
  PERF_IX_PRIORITY,
76
78
  PERF_IX_START_TIME,
79
+ PERF_IX_IO_READ_BYTES_SEC,
80
+ PERF_IX_IO_WRITE_BYTES_SEC,
77
81
  PERF_IX_MAX
78
82
  } perf_proc_offsets_t;
79
83
 
@@ -1210,6 +1214,23 @@ SIGAR_DECLARE(int) sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
1210
1214
  return SIGAR_OK;
1211
1215
  }
1212
1216
 
1217
+ SIGAR_DECLARE(int) sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
1218
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
1219
+ {
1220
+ int status = get_proc_info(sigar, pid);
1221
+ sigar_win32_pinfo_t *pinfo = &sigar->pinfo;
1222
+
1223
+ if (status != SIGAR_OK) {
1224
+ return status;
1225
+ }
1226
+
1227
+ proc_cumulative_disk_io->bytes_read = pinfo->bytes_read;
1228
+ proc_cumulative_disk_io->bytes_written = pinfo->bytes_written;
1229
+ proc_cumulative_disk_io->bytes_total = proc_cumulative_disk_io->bytes_read + proc_cumulative_disk_io->bytes_written;
1230
+
1231
+ return SIGAR_OK;
1232
+ }
1233
+
1213
1234
  #define TOKEN_DAC (STANDARD_RIGHTS_READ | READ_CONTROL | TOKEN_QUERY)
1214
1235
 
1215
1236
  SIGAR_DECLARE(int)
@@ -1441,6 +1462,12 @@ static int get_proc_info(sigar_t *sigar, sigar_pid_t pid)
1441
1462
  case PERF_TITLE_START_TIME:
1442
1463
  perf_offsets[PERF_IX_START_TIME] = offset;
1443
1464
  break;
1465
+ case PERF_TITLE_IO_READ_BYTES_SEC:
1466
+ perf_offsets[PERF_IX_IO_READ_BYTES_SEC] = offset;
1467
+ break;
1468
+ case PERF_TITLE_IO_WRITE_BYTES_SEC:
1469
+ perf_offsets[PERF_IX_IO_WRITE_BYTES_SEC] = offset;
1470
+ break;
1444
1471
  }
1445
1472
  }
1446
1473
 
@@ -1466,6 +1493,8 @@ static int get_proc_info(sigar_t *sigar, sigar_pid_t pid)
1466
1493
  pinfo->handles = PERF_VAL(PERF_IX_HANDLE_CNT);
1467
1494
  pinfo->threads = PERF_VAL(PERF_IX_THREAD_CNT);
1468
1495
  pinfo->page_faults = PERF_VAL(PERF_IX_PAGE_FAULTS);
1496
+ pinfo->bytes_read = PERF_VAL(PERF_IX_IO_READ_BYTES_SEC);
1497
+ pinfo->bytes_written = PERF_VAL(PERF_IX_IO_WRITE_BYTES_SEC);
1469
1498
 
1470
1499
  return SIGAR_OK;
1471
1500
  }
@@ -3693,6 +3722,7 @@ int sigar_who_list_get_win32(sigar_t *sigar,
3693
3722
  #define SIGAR_ARCH "x86"
3694
3723
  #endif
3695
3724
 
3725
+
3696
3726
  int sigar_os_sys_info_get(sigar_t *sigar,
3697
3727
  sigar_sys_info_t *sysinfo)
3698
3728
  {
@@ -3700,7 +3730,7 @@ int sigar_os_sys_info_get(sigar_t *sigar,
3700
3730
  char *vendor_name, *vendor_version, *code_name=NULL;
3701
3731
 
3702
3732
  version.dwOSVersionInfoSize = sizeof(version);
3703
- GetVersionEx((OSVERSIONINFO *)&version);
3733
+ GetVersionEx((OSVERSIONINFO *)&version);
3704
3734
 
3705
3735
  if (version.dwMajorVersion == 4) {
3706
3736
  vendor_name = "Windows NT";
@@ -3740,11 +3770,25 @@ int sigar_os_sys_info_get(sigar_t *sigar,
3740
3770
  code_name = "Vienna";
3741
3771
  }
3742
3772
  }
3743
- else {
3744
- vendor_name = "Windows 2008";
3745
- vendor_version = "2008";
3746
- code_name = "Longhorn Server";
3747
- }
3773
+ else {
3774
+ // not nt work station
3775
+ if (version.dwMinorVersion == 0 || version.dwMinorVersion ==1) {
3776
+ vendor_name = "Windows 2008";
3777
+ vendor_version = "2008";
3778
+ code_name = "Longhorn Server";
3779
+ }
3780
+ else if (version.dwMinorVersion == 2) {
3781
+ vendor_name = "Windows 2012";
3782
+ vendor_version = "2012";
3783
+ code_name = "Windows Server 8";
3784
+ }
3785
+ else {
3786
+ // defaults
3787
+ vendor_name = "Windows Unknown";
3788
+ vendor_version = "2012";
3789
+ }
3790
+ }
3791
+
3748
3792
  }
3749
3793
 
3750
3794
  SIGAR_SSTRCPY(sysinfo->name, "Win32");