1102
1124
strncpy(ifc_name, sdl->sdl_data, sdl->sdl_nlen);
1103
1125
ifc_name[sdl->sdl_nlen] = 0;
1105
py_ifc_info = Py_BuildValue("(sKKKK)",
1127
py_ifc_info = Py_BuildValue("(KKKK)",
1107
1128
if2m->ifm_data.ifi_obytes,
1108
1129
if2m->ifm_data.ifi_ibytes,
1109
1130
if2m->ifm_data.ifi_opackets,
1110
1131
if2m->ifm_data.ifi_ipackets);
1111
PyList_Append(py_retlist, py_ifc_info);
1132
PyDict_SetItemString(py_retdict, ifc_name, py_ifc_info);
1112
1133
Py_XDECREF(py_ifc_info);
1147
* Return a Python dict of tuples for disk I/O information
1150
get_disk_io_counters(PyObject* self, PyObject* args)
1152
PyObject* py_retdict = PyDict_New();
1153
PyObject* py_disk_info;
1155
CFDictionaryRef parent_dict;
1156
CFDictionaryRef props_dict;
1157
CFDictionaryRef stats_dict;
1158
io_registry_entry_t parent;
1159
io_registry_entry_t disk;
1160
io_iterator_t disk_list;
1162
/* Get list of disks */
1163
if (IOServiceGetMatchingServices(kIOMasterPortDefault,
1164
IOServiceMatching(kIOMediaClass),
1165
&disk_list) != kIOReturnSuccess) {
1166
Py_DECREF(py_retdict);
1167
PyErr_SetString(PyExc_RuntimeError, "Unable to get the list of disks.");
1171
/* Iterate over disks */
1172
while ((disk = IOIteratorNext(disk_list)) != 0) {
1177
if (IORegistryEntryGetParentEntry(disk, kIOServicePlane, &parent) != kIOReturnSuccess) {
1178
PyErr_SetString(PyExc_RuntimeError, "Unable to get the disk's parent.");
1179
Py_DECREF(py_retdict);
1180
IOObjectRelease(disk);
1184
if (IOObjectConformsTo(parent, "IOBlockStorageDriver")) {
1185
if(IORegistryEntryCreateCFProperties(
1187
(CFMutableDictionaryRef *) &parent_dict,
1188
kCFAllocatorDefault,
1189
kNilOptions) != kIOReturnSuccess)
1191
PyErr_SetString(PyExc_RuntimeError,
1192
"Unable to get the parent's properties.");
1193
Py_DECREF(py_retdict);
1194
IOObjectRelease(disk);
1195
IOObjectRelease(parent);
1199
if (IORegistryEntryCreateCFProperties(parent,
1200
(CFMutableDictionaryRef *) &props_dict,
1201
kCFAllocatorDefault,
1202
kNilOptions) != kIOReturnSuccess)
1204
PyErr_SetString(PyExc_RuntimeError,
1205
"Unable to get the disk properties.");
1206
Py_DECREF(py_retdict);
1207
IOObjectRelease(disk);
1211
const int kMaxDiskNameSize = 64;
1212
CFStringRef disk_name_ref = (CFStringRef)CFDictionaryGetValue(
1214
CFSTR(kIOBSDNameKey));
1215
char disk_name[kMaxDiskNameSize];
1217
CFStringGetCString(disk_name_ref,
1220
CFStringGetSystemEncoding());
1222
stats_dict = (CFDictionaryRef)CFDictionaryGetValue(
1224
CFSTR(kIOBlockStorageDriverStatisticsKey));
1226
if (stats_dict == NULL) {
1227
PyErr_SetString(PyExc_RuntimeError, "Unable to get disk stats.");
1228
Py_DECREF(py_retdict);
1229
CFRelease(props_dict);
1230
IOObjectRelease(disk);
1231
IOObjectRelease(parent);
1236
int64_t reads, writes, read_bytes, write_bytes, read_time, write_time = 0;
1238
/* Get disk reads/writes */
1239
if ((number = (CFNumberRef)CFDictionaryGetValue(
1241
CFSTR(kIOBlockStorageDriverStatisticsReadsKey))))
1243
CFNumberGetValue(number, kCFNumberSInt64Type, &reads);
1245
if ((number = (CFNumberRef)CFDictionaryGetValue(
1247
CFSTR(kIOBlockStorageDriverStatisticsWritesKey))))
1249
CFNumberGetValue(number, kCFNumberSInt64Type, &writes);
1252
/* Get disk bytes read/written */
1253
if ((number = (CFNumberRef)CFDictionaryGetValue(
1255
CFSTR(kIOBlockStorageDriverStatisticsBytesReadKey))))
1257
CFNumberGetValue(number, kCFNumberSInt64Type, &read_bytes);
1259
if ((number = (CFNumberRef)CFDictionaryGetValue(
1261
CFSTR(kIOBlockStorageDriverStatisticsBytesWrittenKey))))
1263
CFNumberGetValue(number, kCFNumberSInt64Type, &write_bytes);
1266
/* Get disk time spent reading/writing (nanoseconds) */
1267
if ((number = (CFNumberRef)CFDictionaryGetValue(
1269
CFSTR(kIOBlockStorageDriverStatisticsTotalReadTimeKey))))
1271
CFNumberGetValue(number, kCFNumberSInt64Type, &read_time);
1273
if ((number = (CFNumberRef)CFDictionaryGetValue(
1275
CFSTR(kIOBlockStorageDriverStatisticsTotalWriteTimeKey)))) {
1276
CFNumberGetValue(number, kCFNumberSInt64Type, &write_time);
1279
// Read/Write time on OS X comes back in nanoseconds and in psutil
1280
// we've standardized on milliseconds so do the conversion.
1281
py_disk_info = Py_BuildValue("(KKKKKK)",
1283
read_bytes, write_bytes,
1284
read_time / 1000, write_time / 1000);
1285
PyDict_SetItemString(py_retdict, disk_name, py_disk_info);
1286
Py_XDECREF(py_disk_info);
1288
CFRelease(parent_dict);
1289
IOObjectRelease(parent);
1290
CFRelease(props_dict);
1291
IOObjectRelease(disk);
1295
IOObjectRelease (disk_list);