This is LoadView.m in view mode; [Download] [Up]
#import <c.h> #import <libc.h> #import <stdio.h> #import <stdlib.h> #import <string.h> #import <sys/time.h> #import "LoadView.h" #import "LoadWrap.h" #define MAXERRORS 3 extern int loadave(); void swap(void **array, unsigned int indexA, unsigned int indexB); void timer(DPSTimedEntry, double, id); /*--------------------------------------------------------------------------- Besides creating the new frame, initialize variables to default settings. With the addition of the RPC/UDP support, some new variables were added. These variables, initial settings, and impact of the settings follow: Initial Variable Setting Comment hostName NULL overridden later to host name, nErrors MAX... forces the view white if the first client/server call fails; then records # consecutive errors, turning the view white after MAXERRORS, -----------------------------------------------------------------------------*/ @implementation LoadView - initFrame:(const NXRect *) frameRect; { unsigned int i; [(self = [super initFrame:frameRect]) allocateGState]; hostName = NULL; for(i = 0; i < QUEUES; i++) which[i] = YES; index = -1; nErrors = MAXERRORS - 1; /* Forces view white if initial call fails. */ timedEntry = NULL; maxLoad = 0.0; shift = getFloatDefault("ShiftDisplay"); update = getFloatDefault("LocalUpdateSeconds"); divisionColor = getColorDefault("DivisionColor"); backgroundColor = getColorDefault("BackgroundColor"); quiescentColor = getColorDefault("QuiescentColor"); queueColors[Q1MIN] = getColorDefault("Q1Color"); queueColors[Q5MIN] = getColorDefault("Q5Color"); queueColors[Q15MIN] = getColorDefault("Q15Color"); return self; } - drawSelf:(const NXRect *) rects :(int) rectCount { float currentLoad; int oldIndex = index, width = (int) bounds.size.width; index = ++index % width; if ((currentLoad = [self getLoadAverage:index]) == CERROR) { index = oldIndex; if (++nErrors == MAXERRORS) [self displayAll]; return self; } if (index == --width) [[self moveArray] displayAll]; else if (currentLoad > maxLoad || nErrors >= MAXERRORS) [self displayAll]; else [self drawOneLoad:index]; nErrors = 0; return self; } - free { [self freeGState]; if (timedEntry != NULL) DPSRemoveTimedEntry(timedEntry); if (hostName != NULL) free((void *) hostName); return [super free]; } - startTimer { timedEntry = DPSAddTimedEntry(update, (DPSTimedEntryProc) &timer, self, NX_BASETHRESHOLD); return self; } - (float) getLoadAverage:(int) offset { int i, scale; long vector[QUEUES]; float largest = 0.0; if ([self loadAverage:vector loadScale:&scale] == nil) return CERROR; for (i = 0; i < QUEUES; i++) { load[offset][i] = vector[i] / (float) scale; if(which[i] && load[offset][i] > largest) largest = load[offset][i]; } return largest; } - loadAverage:(long *) vector loadScale:(int *) scale { if ((*scale = loadave(vector)) == CERROR) return nil; return self; } - drawOneLoad:(int) offset { float vector[QUEUES]; unsigned int i, j, order[QUEUES]; for (i = 0; i < QUEUES; i++) vector[order[i] = i] = (bounds.size.height / maxLoad) * load[offset][i]; for (j = 1; j < QUEUES; j++) for (i = 1; i < QUEUES; i++) if (vector[order[i]] > vector[order[i - 1]]) swap((void **) order, i, i - 1); for (i = 0; i < QUEUES; i++) if (which[order[i]] && vector[order[i]] > 0.0) { NXSetColor(queueColors[order[i]]); drawload((float) offset, vector[order[i]]); } return self; } - moveArray { unsigned int i, j, increment; index = (unsigned int) (bounds.size.width - (bounds.size.width * shift)); increment = (unsigned int) (bounds.size.width - index); for (i = 0; i < index; i++) for (j = 0; j < QUEUES; j++) load[i][j] = load[i + increment][j]; --index; return self; } - displayAll { unsigned int i; NXSetColor((nErrors >= MAXERRORS) ? quiescentColor : backgroundColor); NXRectFill(&bounds); if (index < 0) return self; maxLoad = (float) ceil((double) [self maxOfArray]); if (maxLoad > 1.0) { float deltaScale = bounds.size.height / maxLoad; NXSetColor(divisionColor); for (i = 1; i < (int) maxLoad; i++) drawline(rint(deltaScale * i), bounds.size.width); } for (i = 0; i <= index; i++) [self drawOneLoad:i]; return self; } - (float) maxOfArray { unsigned int i, j; float largest = 0.0; for (i = 0; i <= index; i++) for (j = 0; j < QUEUES; j++) if (which[j] && load[i][j] > largest) largest = load[i][j]; return(largest); } - setHostName:(const char *) name { hostName = NXCopyStringBuffer(name); return self; } - setWhich:(BOOL *) array { unsigned int i; for(i = 0; i < QUEUES; i++) which[i] = array[i]; return self; } - (float) shift { return shift; } - setShift:(float) value { shift = value; return self; } - (float) update { return update; } - setUpdate:(float) value { update = value; return self; } - setDivisionColor:(NXColor) color { divisionColor = color; return self; } - setBackgroundColor:(NXColor) color { backgroundColor = color; return self; } - setQuiescentColor:(NXColor) color { quiescentColor = color; return self; } - setQueueColors:(NXColor *) colors { unsigned int i; for (i = 0; i < QUEUES; i++) queueColors[i] = colors[i]; return self; } void swap(void **array, unsigned int indexA, unsigned int indexB) { void *temp = array[indexA]; array[indexA] = array[indexB]; array[indexB] = temp; } void timer(DPSTimedEntry teNumber, double now, id sender) { [sender display]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.