Instead, use setitimer() to receive a SIGALRM after the requested number of seconds elapses, and change the tests to report back the true number of iterations.
Signed-off-by: Adam Jackson <[email protected]> --- do_arcs.c | 12 ++++-- do_blt.c | 102 ++++++++++++++++++++++++++++++++++++------------------- do_complex.c | 12 ++++-- do_dots.c | 6 ++- do_lines.c | 6 ++- do_movewin.c | 24 +++++++++---- do_rects.c | 12 ++++-- do_segs.c | 6 ++- do_simple.c | 24 +++++++++---- do_text.c | 42 +++++++++++++++-------- do_traps.c | 18 ++++++--- do_tris.c | 12 ++++-- do_valgc.c | 6 ++- do_windows.c | 21 ++++++++--- x11perf.c | 57 +++++++++++++++++++++++-------- x11perf.h | 106 +++++++++++++++++++++++++++++++++------------------------- 16 files changed, 304 insertions(+), 162 deletions(-) diff --git a/do_arcs.c b/do_arcs.c index 5c5f1ba..f9b05a2 100644 --- a/do_arcs.c +++ b/do_arcs.c @@ -451,7 +451,7 @@ InitWideDoubleDashedEllipses(XParms xp, Parms p, int reps) return reps; } -void +int DoArcs(XParms xp, Parms p, int reps) { int i; @@ -466,11 +466,13 @@ DoArcs(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoFilledArcs(XParms xp, Parms p, int reps) { int i; @@ -485,8 +487,10 @@ DoFilledArcs(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/do_blt.c b/do_blt.c index 2834392..0d3cd3e 100644 --- a/do_blt.c +++ b/do_blt.c @@ -69,7 +69,7 @@ InitScroll(XParms xp, Parms p, int reps) return reps; } -void +int DoScroll(XParms xp, Parms p, int reps) { int i, size, x, y, xorg, yorg, delta; @@ -106,8 +106,10 @@ DoScroll(XParms xp, Parms p, int reps) x = xorg; } } - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void @@ -122,6 +124,8 @@ EndScroll(XParms xp, Parms p) { } +static int nsegs; + static void InitCopyLocations(XParms xp, Parms p, int reps) { @@ -129,6 +133,8 @@ InitCopyLocations(XParms xp, Parms p, int reps) int xinc, yinc; int width, height; + nsegs = reps > 50000 ? 50000 : reps; + /* Try to exercise all alignments of src and destination equally, as well as all 4 top-to-bottom/bottom-to-top, left-to-right, right-to-left copying directions. Computation done here just to make sure slow @@ -146,9 +152,9 @@ InitCopyLocations(XParms xp, Parms p, int reps) x2 = width; y2 = height; - segsa = (XSegment *)malloc(reps * sizeof(XSegment)); - segsb = (XSegment *)malloc(reps * sizeof(XSegment)); - for (i = 0; i != reps; i++) { + segsa = (XSegment *)malloc(nsegs * sizeof(XSegment)); + segsb = (XSegment *)malloc(nsegs * sizeof(XSegment)); + for (i = 0; i != nsegs; i++) { segsa[i].x1 = x1; segsa[i].y1 = y1; segsa[i].x2 = x2; @@ -228,14 +234,16 @@ InitPutImage(XParms xp, Parms p, int reps) return reps; } -static void +static int CopyArea(XParms xp, Parms p, int reps, Drawable src, Drawable dst) { int i, size; XSegment *sa, *sb; size = p->special; - for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) { + for (i = 0; i != reps; i++) { + sa = segsa + (i % nsegs); + sb = segsb + (i % nsegs); XCopyArea(xp->d, src, dst, xp->fggc, sa->x1, sa->y1, size, size, sa->x2, sa->y2); XCopyArea(xp->d, src, dst, xp->fggc, @@ -244,37 +252,41 @@ CopyArea(XParms xp, Parms p, int reps, Drawable src, Drawable dst) sb->x2, sb->y2, size, size, sb->x1, sb->y1); XCopyArea(xp->d, src, dst, xp->fggc, sb->x1, sb->y1, size, size, sb->x2, sb->y2); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoCopyWinWin(XParms xp, Parms p, int reps) { - CopyArea(xp, p, reps, xp->w, xp->w); + return CopyArea(xp, p, reps, xp->w, xp->w); } -void +int DoCopyPixWin(XParms xp, Parms p, int reps) { - CopyArea(xp, p, reps, pix, xp->w); + return CopyArea(xp, p, reps, pix, xp->w); } -void +int DoCopyWinPix(XParms xp, Parms p, int reps) { - CopyArea(xp, p, reps, xp->w, pix); + int i = CopyArea(xp, p, reps, xp->w, pix); xp->p = pix; /* HardwareSync will now sync on pixmap */ + return i; } -void +int DoCopyPixPix(XParms xp, Parms p, int reps) { - CopyArea(xp, p, reps, pix, pix); + int i = CopyArea(xp, p, reps, pix, pix); xp->p = pix; /* HardwareSync will now sync on pixmap */ + return i; } -void +int DoGetImage(XParms xp, Parms p, int reps) { int i, size; @@ -283,7 +295,9 @@ DoGetImage(XParms xp, Parms p, int reps) size = p->special; format = (p->font == NULL) ? ZPixmap : XYPixmap; - for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) { + for (i = 0; i != reps; i++) { + sa = segsa + (i % nsegs); + sb = segsb + (i % nsegs); XDestroyImage(image); image = XGetImage(xp->d, xp->w, sa->x1, sa->y1, size, size, xp->planemask, format); @@ -311,18 +325,22 @@ rectangle. (void) XGetSubImage(xp->d, xp->w, sb->x1, sb->y1, size, size, xp->planemask, ZPixmap, image, sb->x2, sb->y2); */ - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoPutImage(XParms xp, Parms p, int reps) { int i, size; XSegment *sa, *sb; size = p->special; - for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) { + for (i = 0; i != reps; i++) { + sa = segsa + (i % nsegs); + sb = segsb + (i % nsegs); XPutImage(xp->d, xp->w, xp->fggc, image, sa->x1, sa->y1, sa->x2, sa->y2, size, size); XPutImage(xp->d, xp->w, xp->fggc, image, @@ -331,8 +349,10 @@ DoPutImage(XParms xp, Parms p, int reps) sb->x2, sb->y2, sb->x2, sb->y2, size, size); XPutImage(xp->d, xp->w, xp->fggc, image, sb->x1, sb->y1, sb->x2, sb->y2, size, size); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } #ifdef MITSHM @@ -447,14 +467,16 @@ InitShmPutImage(XParms xp, Parms p, int reps) return reps; } -void +int DoShmPutImage(XParms xp, Parms p, int reps) { int i, size; XSegment *sa, *sb; size = p->special; - for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) { + for (i = 0; i != reps; i++) { + sa = segsa + (i % nsegs); + sb = segsb + (i % nsegs); XShmPutImage(xp->d, xp->w, xp->fggc, &shm_image, sa->x1, sa->y1, sa->x2, sa->y2, size, size, False); XShmPutImage(xp->d, xp->w, xp->fggc, &shm_image, @@ -463,8 +485,10 @@ DoShmPutImage(XParms xp, Parms p, int reps) sb->x2, sb->y2, sb->x2, sb->y2, size, size, False); XShmPutImage(xp->d, xp->w, xp->fggc, &shm_image, sb->x1, sb->y1, sb->x2, sb->y2, size, size, False); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void @@ -542,14 +566,16 @@ InitCopyPlane(XParms xp, Parms p, int reps) return reps; } -void +int DoCopyPlane(XParms xp, Parms p, int reps) { int i, size; XSegment *sa, *sb; size = p->special; - for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) { + for (i = 0; i != reps; i++) { + sa = segsa + (i % nsegs); + sb = segsb + (i % nsegs); XCopyPlane(xp->d, pix, xp->w, xp->fggc, sa->x1, sa->y1, size, size, sa->x2, sa->y2, 1); XCopyPlane(xp->d, pix, xp->w, xp->fggc, @@ -558,8 +584,10 @@ DoCopyPlane(XParms xp, Parms p, int reps) sb->x2, sb->y2, size, size, sb->x1, sb->y1, 1); XCopyPlane(xp->d, pix, xp->w, xp->fggc, sb->x1, sb->y1, size, size, sb->x2, sb->y2, 1); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } #include <X11/extensions/Xrender.h> @@ -643,14 +671,16 @@ EndCompositeWin (XParms xp, Parms p) } } -static void +static int CompositeArea(XParms xp, Parms p, int reps, Picture src, Picture dst) { int i, size; XSegment *sa, *sb; size = p->special; - for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) { + for (i = 0; i != reps; i++) { + sa = segsa + (i % nsegs); + sb = segsb + (i % nsegs); XRenderComposite (xp->d, xp->func, src, None, dst, sa->x1, sa->y1, 0, 0, @@ -664,18 +694,20 @@ CompositeArea(XParms xp, Parms p, int reps, Picture src, Picture dst) XRenderComposite (xp->d, xp->func, src, None, dst, sb->x1, sb->y1, 0, 0, sb->x2, sb->y2, size, size); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoCompositeWinWin (XParms xp, Parms p, int reps) { - CompositeArea (xp, p, reps, winPict, winPict); + return CompositeArea (xp, p, reps, winPict, winPict); } -void +int DoCompositePixWin (XParms xp, Parms p, int reps) { - CompositeArea (xp, p, reps, pixPict, winPict); + return CompositeArea (xp, p, reps, pixPict, winPict); } diff --git a/do_complex.c b/do_complex.c index 3eac738..bffcf1f 100644 --- a/do_complex.c +++ b/do_complex.c @@ -95,7 +95,7 @@ InitComplexPoly(XParms xp, Parms p, int reps) return reps; } -void +int DoComplexPoly(XParms xp, Parms p, int reps) { int i, j; @@ -112,8 +112,10 @@ DoComplexPoly(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void @@ -168,7 +170,7 @@ InitGeneralPoly(XParms xp, Parms p, int reps) return reps; } -void +int DoGeneralPoly(XParms xp, Parms p, int reps) { int i, j; @@ -189,6 +191,8 @@ DoGeneralPoly(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } diff --git a/do_dots.c b/do_dots.c index 8279437..0aa89b7 100644 --- a/do_dots.c +++ b/do_dots.c @@ -42,7 +42,7 @@ InitDots(XParms xp, Parms p, int reps) return reps; } -void +int DoDots(XParms xp, Parms p, int reps) { int i; @@ -53,8 +53,10 @@ DoDots(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/do_lines.c b/do_lines.c index 88a1ebd..779e06c 100644 --- a/do_lines.c +++ b/do_lines.c @@ -272,7 +272,7 @@ InitWideDoubleDashedLines(XParms xp, Parms p, int reps) return reps; } -void +int DoLines(XParms xp, Parms p, int reps) { int i; @@ -288,8 +288,10 @@ DoLines(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/do_movewin.c b/do_movewin.c index ed96ae1..ffd92b8 100644 --- a/do_movewin.c +++ b/do_movewin.c @@ -62,7 +62,7 @@ InitMoveWindows(XParms xp, Parms p, int reps) return reps; } -void +int DoMoveWindows(XParms xp, Parms p, int reps) { int i, j; @@ -78,8 +78,10 @@ DoMoveWindows(XParms xp, Parms p, int reps) XMoveWindow(xp->d, children[j], positions[j].x + x_offset, positions[j].y + y_offset); } - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void @@ -89,7 +91,7 @@ EndMoveWindows(XParms xp, Parms p) free(positions); } -void +int DoResizeWindows(XParms xp, Parms p, int reps) { int i, j, delta2; @@ -102,8 +104,10 @@ DoResizeWindows(XParms xp, Parms p, int reps) XResizeWindow(xp->d, children[j], CHILDSIZE+delta2, CHILDSIZE-delta2); } - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } int @@ -126,7 +130,7 @@ InitCircWindows(XParms xp, Parms p, int reps) return reps; } -void +int DoCircWindows(XParms xp, Parms p, int reps) { int i, j; @@ -135,8 +139,10 @@ DoCircWindows(XParms xp, Parms p, int reps) { for (j = 0; j != p->objects; j++) XCirculateSubwindows (xp->d, xp->w, RaiseLowest); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void @@ -179,7 +185,7 @@ InitMoveTree(XParms xp, Parms p, int reps) return reps; } -void +int DoMoveTree(XParms xp, Parms p, int reps) { int i; @@ -192,8 +198,10 @@ DoMoveTree(XParms xp, Parms p, int reps) if (x_offset + xmax > WIDTH) x_offset = 0; XMoveWindow(xp->d, cover, x_offset, y_offset); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/do_rects.c b/do_rects.c index f697cdb..958c127 100644 --- a/do_rects.c +++ b/do_rects.c @@ -83,7 +83,7 @@ InitRectangles(XParms xp, Parms p, int reps) return reps; } -void +int DoRectangles(XParms xp, Parms p, int reps) { int i; @@ -94,11 +94,13 @@ DoRectangles(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoOutlineRectangles(XParms xp, Parms p, int reps) { int i; @@ -109,8 +111,10 @@ DoOutlineRectangles(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/do_segs.c b/do_segs.c index bc13fbd..805f25f 100644 --- a/do_segs.c +++ b/do_segs.c @@ -356,7 +356,7 @@ InitWideVertSegments(XParms xp, Parms p, int reps) } -void +int DoSegments(XParms xp, Parms p, int reps) { int i; @@ -371,8 +371,10 @@ DoSegments(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/do_simple.c b/do_simple.c index 0904b6f..2d1274a 100644 --- a/do_simple.c +++ b/do_simple.c @@ -31,19 +31,21 @@ SOFTWARE. static Atom XA_PK_TEMP; -void +int DoNoOp(XParms xp, Parms p, int reps) { int i; for (i = 0; i != reps; i++) { XNoOp(xp->d); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoGetAtom(XParms xp, Parms p, int reps) { char *atom; @@ -52,11 +54,13 @@ DoGetAtom(XParms xp, Parms p, int reps) for (i = 0; i != reps; i++) { atom = XGetAtomName (xp->d, 1); XFree(atom); /* fix XBUG 6480 */ - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoQueryPointer(XParms xp, Parms p, int reps) { int i; @@ -66,8 +70,10 @@ DoQueryPointer(XParms xp, Parms p, int reps) for (i = 0; i != reps; i++) { XQueryPointer (xp->d, xp->w, &w, &w, &x, &x, &x, &x, &m); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } int @@ -86,7 +92,7 @@ InitGetProperty(XParms xp, Parms p, int reps) return reps; } -void +int DoGetProperty(XParms xp, Parms p, int reps) { int i; @@ -101,7 +107,9 @@ DoGetProperty(XParms xp, Parms p, int reps) xp->d, xp->w, XA_PK_TEMP, 0, 4, False, AnyPropertyType, &actual_type, &actual_format, &actual_length, &bytes_remaining, &prop); - CheckAbort (); XFree(prop); + if (CheckCancel()) return i; } + + return i; } diff --git a/do_text.c b/do_text.c index 6b41201..f5eb2a0 100644 --- a/do_text.c +++ b/do_text.c @@ -217,7 +217,7 @@ InitText16(XParms xp, Parms p, int reps) return reps; } -void +int DoText(XParms xp, Parms p, int reps) { int i, line, startLine; @@ -235,11 +235,13 @@ DoText(XParms xp, Parms p, int reps) startLine = (startLine + 1) % totalLines; } line = (line + 1) % totalLines; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoText16(XParms xp, Parms p, int reps) { int i, line, startLine; @@ -257,11 +259,13 @@ DoText16(XParms xp, Parms p, int reps) startLine = (startLine + 1) % totalLines; } line = (line + 1) % totalLines; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoPolyText(XParms xp, Parms p, int reps) { int i, line, startLine; @@ -279,11 +283,13 @@ DoPolyText(XParms xp, Parms p, int reps) startLine = (startLine + 1) % totalLines; } line = (line + 1) % totalLines; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoPolyText16(XParms xp, Parms p, int reps) { int i, line, startLine; @@ -301,11 +307,13 @@ DoPolyText16(XParms xp, Parms p, int reps) startLine = (startLine + 1) % totalLines; } line = (line + 1) % totalLines; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoImageText(XParms xp, Parms p, int reps) { int i, line, startLine; @@ -323,11 +331,13 @@ DoImageText(XParms xp, Parms p, int reps) line = startLine; } line = (line + 1) % totalLines; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } -void +int DoImageText16(XParms xp, Parms p, int reps) { int i, line, startLine; @@ -345,8 +355,10 @@ DoImageText16(XParms xp, Parms p, int reps) line = startLine; } line = (line + 1) % totalLines; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void @@ -470,7 +482,7 @@ InitAAText(XParms xp, Parms p, int reps) return reps; } -void +int DoAAText(XParms xp, Parms p, int reps) { int i, line, startLine; @@ -488,8 +500,10 @@ DoAAText(XParms xp, Parms p, int reps) startLine = (startLine + 1) % totalLines; } line = (line + 1) % totalLines; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/do_traps.c b/do_traps.c index 326b56e..6f9ef06 100644 --- a/do_traps.c +++ b/do_traps.c @@ -77,7 +77,7 @@ InitTrapezoids(XParms xp, Parms p, int reps) return reps; } -void +int DoTrapezoids(XParms xp, Parms p, int reps) { int i, j; @@ -94,8 +94,10 @@ DoTrapezoids(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void @@ -229,7 +231,7 @@ InitFixedTraps(XParms xp, Parms p, int reps) return reps; } -void +int DoFixedTraps(XParms xp, Parms p, int reps) { int i; @@ -250,8 +252,10 @@ DoFixedTraps(XParms xp, Parms p, int reps) src = white; else src = black; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void @@ -363,7 +367,7 @@ InitFixedTrapezoids(XParms xp, Parms p, int reps) return reps; } -void +int DoFixedTrapezoids(XParms xp, Parms p, int reps) { int i; @@ -381,8 +385,10 @@ DoFixedTrapezoids(XParms xp, Parms p, int reps) src = white; else src = black; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/do_tris.c b/do_tris.c index cf0200e..30520c8 100644 --- a/do_tris.c +++ b/do_tris.c @@ -131,7 +131,7 @@ InitTriangles(XParms xp, Parms p, int reps) #ifndef POLYTRIANGLE_HACK -void +int DoTriangles(XParms xp, Parms p, int reps) { int i, j; @@ -148,8 +148,10 @@ DoTriangles(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } #else @@ -206,7 +208,7 @@ XPolyTriangle(register Display *dpy, SyncHandle(); } -void +int DoTriangles(XParms xp, Parms p, int reps) { int i, j; @@ -219,8 +221,10 @@ DoTriangles(XParms xp, Parms p, int reps) pgc = xp->fggc; else pgc = xp->bggc; - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } #endif diff --git a/do_valgc.c b/do_valgc.c index 75f1a1a..8cab740 100644 --- a/do_valgc.c +++ b/do_valgc.c @@ -41,7 +41,7 @@ InitGC(XParms xp, Parms p, int reps) return reps; } -void +int DoChangeGC(XParms xp, Parms p, int reps) { int i; @@ -63,8 +63,10 @@ DoChangeGC(XParms xp, Parms p, int reps) gcv.foreground = xp->foreground; XChangeGC(xp->d, xp->fggc, GCForeground , &gcv); XDrawPoint(xp->d, win[1], xp->fggc, 5, 5); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/do_windows.c b/do_windows.c index 024d76b..e8da795 100644 --- a/do_windows.c +++ b/do_windows.c @@ -83,7 +83,7 @@ CreateParents(XParms xp, Parms p, int reps) } /* CreateParents */ -void +int MapParents(XParms xp, Parms p, int reps) { int i; @@ -91,6 +91,7 @@ MapParents(XParms xp, Parms p, int reps) for (i = 0; i != parentwindows; i++) { XMapWindow(xp->d, parents[i]); } + return parentwindows; } void @@ -128,7 +129,7 @@ CreateChildGroup(XParms xp, Parms p, Window parent) XMapSubwindows (xp->d, parent); } -void +int CreateChildren(XParms xp, Parms p, int reps) { int i; @@ -136,6 +137,8 @@ CreateChildren(XParms xp, Parms p, int reps) for (i = 0; i != parentwindows; i++) { CreateChildGroup(xp, p, parents[i]); } /* end i */ + + return parentwindows; } void @@ -165,7 +168,7 @@ InitMap(XParms xp, Parms p, int reps) return reps; } -void +int UnmapParents(XParms xp, Parms p, int reps) { int i; @@ -173,6 +176,8 @@ UnmapParents(XParms xp, Parms p, int reps) for (i = 0; i != parentwindows; i++) { XUnmapWindow(xp->d, parents[i]); } + + return parentwindows; } void @@ -194,7 +199,7 @@ InitDestroy(XParms xp, Parms p, int reps) return reps; } -void +int DestroyParents(XParms xp, Parms p, int reps) { int i; @@ -202,6 +207,8 @@ DestroyParents(XParms xp, Parms p, int reps) for (i = 0; i != parentwindows; i++) { XDestroyWindow(xp->d, parents[i]); } + + return parentwindows; } @@ -259,15 +266,17 @@ InitPopups(XParms xp, Parms p, int reps) return reps; } -void +int DoPopUps(XParms xp, Parms p, int reps) { int i; for (i = 0; i != reps; i++) { XMapWindow(xp->d, popup); XUnmapWindow(xp->d, popup); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } void diff --git a/x11perf.c b/x11perf.c index 15eb04d..410967c 100644 --- a/x11perf.c +++ b/x11perf.c @@ -38,12 +38,18 @@ SOFTWARE. #define Time_t time_t #include <stdlib.h> +#include <limits.h> +#include <sys/time.h> +#ifndef ITIMER_REAL +#define NEED_CALIBRATE +#endif + /* Only for working on ``fake'' servers, for hardware that doesn't exist */ static Bool drawToFakeServer = False; static Bool falsePrecision = False; static Pixmap tileToQuery = None; static char *displayName; -int abortTest; +int abortTest = 0; typedef struct _RopNames { char *name; int rop; } RopNameRec, *RopNamePtr; @@ -228,6 +234,12 @@ PrintTime(void) static void InitTimes(void) { +#ifndef NEED_CALIBRATE + struct itimerval it = { {0, }, }, oit = { {0, }, }; + + it.it_value.tv_sec = seconds; + setitimer(ITIMER_REAL, &it, &oit); +#endif X_GETTIMEOFDAY(&start); } @@ -554,15 +566,17 @@ HardwareSync(XParms xp) if (image) XDestroyImage(image); } -static void +static int DoHardwareSync(XParms xp, Parms p, int reps) { int i; for (i = 0; i != reps; i++) { HardwareSync(xp); - CheckAbort (); + if (CheckCancel()) return i; } + + return i; } static Test syncTest = { @@ -633,7 +647,7 @@ DestroyClipWindows(XParms xp, int clips) static double -DoTest(XParms xp, Test *test, int reps) +DoTest(XParms xp, Test *test, int *reps) { double time; unsigned int ret_width, ret_height; @@ -643,7 +657,7 @@ DoTest(XParms xp, Test *test, int reps) XForceScreenSaver(xp->d, ScreenSaverReset); HardwareSync (xp); InitTimes (); - (*test->proc) (xp, &test->parms, reps); + *reps = (*test->proc) (xp, &test->parms, *reps); HardwareSync(xp); time = ElapsedTime(syncTime); @@ -655,13 +669,12 @@ DoTest(XParms xp, Test *test, int reps) return time; } - static int CalibrateTest(XParms xp, Test *test, int seconds, double *usecperobj) { -#define goal 2500000.0 /* Try to get up to 2.5 seconds */ -#define enough 2000000.0 /* But settle for 2.0 seconds */ -#define tick 10000.0 /* Assume clock not faster than .01 seconds */ + double goal = 2500000.0; /* Try to get up to 2.5 seconds */ + double enough = 2000000.0; /* But settle for 2.0 seconds */ + double tick = 1000.0; /* Assume clock not faster than .001 seconds */ double usecs; int reps, didreps; /* Reps desired, reps performed */ @@ -677,13 +690,17 @@ CalibrateTest(XParms xp, Test *test, int seconds, double *usecperobj) if (fixedReps != 0) { return fixedReps; } + + if (seconds * 1.0e6 < enough) + enough = seconds * 1.0e6; + reps = 1; for (;;) { XDestroySubwindows(xp->d, xp->w); XClearWindow(xp->d, xp->w); didreps = (*test->init) (xp, &test->parms, reps); - CheckAbort (); if (didreps == 0) { + printf("didreps = 0\n"); return 0; } if ( test->clips < clips ) @@ -698,7 +715,7 @@ CalibrateTest(XParms xp, Test *test, int seconds, double *usecperobj) (*test->passCleanup) (xp, &test->parms); (*test->cleanup) (xp, &test->parms); DestroyClipWindows(xp, test->clips); - CheckAbort (); + (void) CheckCancel (); if (didreps != reps) { /* The test can't do the number of reps as we asked for. @@ -708,7 +725,9 @@ CalibrateTest(XParms xp, Test *test, int seconds, double *usecperobj) return didreps; } /* Did we go long enough? */ - if (usecs >= enough) break; + if (usecs >= enough) { + break; + } /* Don't let too short a clock make new reps wildly high */ if (usecs <= tick)reps = reps*10; @@ -731,7 +750,7 @@ CalibrateTest(XParms xp, Test *test, int seconds, double *usecperobj) } reps = (reps + 1) * exponent; return reps; -} /* CalibrateTest */ +} static void CreatePerfGCs(XParms xp, int func, unsigned long pm) @@ -838,7 +857,7 @@ static void ProcessTest(XParms xp, Test *test, int func, unsigned long pm, char *label) { double time, totalTime; - int reps; + int reps = INT_MAX; int j; xp->planemask = pm; @@ -849,9 +868,14 @@ ProcessTest(XParms xp, Test *test, int func, unsigned long pm, char *label) pm = ~0L; } CreatePerfGCs(xp, func, pm); +#ifdef NEED_CALIBRATE DisplayStatus(xp->d, "Calibrating", label, 0); reps = CalibrateTest(xp, test, seconds, &time); +#endif if (reps != 0) { +#ifndef NEED_CALIBRATE + reps = INT_MAX; +#endif srand(1); /* allow reproducible results */ XDestroySubwindows(xp->d, xp->w); XClearWindow(xp->d, xp->w); @@ -872,7 +896,7 @@ ProcessTest(XParms xp, Test *test, int func, unsigned long pm, char *label) totalTime = 0.0; for (j = 0; j != repeat; j++) { DisplayStatus(xp->d, "Testing", label, j+1); - time = DoTest(xp, test, reps); + time = DoTest(xp, test, &reps); if (abortTest) AbortTest (); totalTime += time; @@ -1274,6 +1298,9 @@ main(int argc, char *argv[]) #ifdef SIGHUP (void) signal(SIGHUP, Cleanup); #endif +#ifndef NEED_CALIBRATE + (void) signal(SIGALRM, Cleanup); +#endif XSetScreenSaver(xparms.d, 8 * 3600, ssInterval, ssPreferBlanking, ssAllowExposures); diff --git a/x11perf.h b/x11perf.h index 597b1f7..6501bce 100644 --- a/x11perf.h +++ b/x11perf.h @@ -37,6 +37,7 @@ SOFTWARE. #include <X11/Xfuncs.h> #endif #include <stddef.h> +#include <signal.h> #include <X11/extensions/Xrender.h> #define POLY 1000 /* # (small) items in poly calls */ @@ -103,7 +104,7 @@ typedef struct _XParms { } XParmRec, *XParms; typedef int (*InitProc)(XParms xp, Parms p, int reps); -typedef void (*Proc)(XParms xp, Parms p, int reps); +typedef int (*Proc)(XParms xp, Parms p, int reps); typedef void (*CleanupProc)(XParms xp, Parms p); typedef enum { @@ -138,6 +139,19 @@ extern int abortTest; extern void AbortTest (void); #define CheckAbort() if (abortTest) AbortTest () + +#include <stdio.h> +static inline Bool CheckCancel(void) +{ + if (abortTest == SIGALRM) { + abortTest = 0; + return 1; + } else if (abortTest) { + AbortTest(); + } + return 0; +} + #define ForEachTest(x) for (x = 0; test[x].option != NULL; x++) @@ -162,28 +176,28 @@ extern int InitDashedEllipses ( XParms xp, Parms p, int reps ); extern int InitWideDashedEllipses ( XParms xp, Parms p, int reps ); extern int InitDoubleDashedEllipses ( XParms xp, Parms p, int reps ); extern int InitWideDoubleDashedEllipses ( XParms xp, Parms p, int reps ); -extern void DoArcs ( XParms xp, Parms p, int reps ); -extern void DoFilledArcs ( XParms xp, Parms p, int reps ); +extern int DoArcs ( XParms xp, Parms p, int reps ); +extern int DoFilledArcs ( XParms xp, Parms p, int reps ); extern void EndArcs ( XParms xp, Parms p ); /* do_blt.c */ extern int InitScroll ( XParms xp, Parms p, int reps ); -extern void DoScroll ( XParms xp, Parms p, int reps ); +extern int DoScroll ( XParms xp, Parms p, int reps ); extern void MidScroll ( XParms xp, Parms p ); extern void EndScroll ( XParms xp, Parms p ); extern int InitCopyWin ( XParms xp, Parms p, int reps ); extern int InitCopyPix ( XParms xp, Parms p, int reps ); extern int InitGetImage ( XParms xp, Parms p, int reps ); extern int InitPutImage ( XParms xp, Parms p, int reps ); -extern void DoCopyWinWin ( XParms xp, Parms p, int reps ); -extern void DoCopyPixWin ( XParms xp, Parms p, int reps ); -extern void DoCopyWinPix ( XParms xp, Parms p, int reps ); -extern void DoCopyPixPix ( XParms xp, Parms p, int reps ); -extern void DoGetImage ( XParms xp, Parms p, int reps ); -extern void DoPutImage ( XParms xp, Parms p, int reps ); +extern int DoCopyWinWin ( XParms xp, Parms p, int reps ); +extern int DoCopyPixWin ( XParms xp, Parms p, int reps ); +extern int DoCopyWinPix ( XParms xp, Parms p, int reps ); +extern int DoCopyPixPix ( XParms xp, Parms p, int reps ); +extern int DoGetImage ( XParms xp, Parms p, int reps ); +extern int DoPutImage ( XParms xp, Parms p, int reps ); #ifdef MITSHM extern int InitShmPutImage ( XParms xp, Parms p, int reps ); -extern void DoShmPutImage ( XParms xp, Parms p, int reps ); +extern int DoShmPutImage ( XParms xp, Parms p, int reps ); extern void EndShmPutImage ( XParms xp, Parms p ); #endif extern void MidCopyPix ( XParms xp, Parms p ); @@ -191,7 +205,7 @@ extern void EndCopyWin ( XParms xp, Parms p ); extern void EndCopyPix ( XParms xp, Parms p ); extern void EndGetImage ( XParms xp, Parms p ); extern int InitCopyPlane ( XParms xp, Parms p, int reps ); -extern void DoCopyPlane ( XParms xp, Parms p, int reps ); +extern int DoCopyPlane ( XParms xp, Parms p, int reps ); int InitCompositeWin(XParms xp, Parms p, int reps); @@ -199,7 +213,7 @@ InitCompositeWin(XParms xp, Parms p, int reps); void EndCompositeWin (XParms xp, Parms p); -void +int DoCompositeWinWin (XParms xp, Parms p, int reps); int @@ -208,19 +222,19 @@ InitCompositePix(XParms xp, Parms p, int reps); void EndCompositePix (XParms xp, Parms p); -void +int DoCompositePixWin (XParms xp, Parms p, int reps); /* do_complex.c */ extern int InitComplexPoly ( XParms xp, Parms p, int reps ); -extern void DoComplexPoly ( XParms xp, Parms p, int reps ); +extern int DoComplexPoly ( XParms xp, Parms p, int reps ); extern void EndComplexPoly ( XParms xp, Parms p ); extern int InitGeneralPoly ( XParms xp, Parms p, int reps ); -extern void DoGeneralPoly ( XParms xp, Parms p, int reps ); +extern int DoGeneralPoly ( XParms xp, Parms p, int reps ); /* do_dots.c */ extern int InitDots ( XParms xp, Parms p, int reps ); -extern void DoDots ( XParms xp, Parms p, int reps ); +extern int DoDots ( XParms xp, Parms p, int reps ); extern void EndDots ( XParms xp, Parms p ); /* do_lines.c */ @@ -230,25 +244,25 @@ extern int InitDashedLines ( XParms xp, Parms p, int reps ); extern int InitWideDashedLines ( XParms xp, Parms p, int reps ); extern int InitDoubleDashedLines ( XParms xp, Parms p, int reps ); extern int InitWideDoubleDashedLines ( XParms xp, Parms p, int reps ); -extern void DoLines ( XParms xp, Parms p, int reps ); +extern int DoLines ( XParms xp, Parms p, int reps ); extern void EndLines ( XParms xp, Parms p ); /* do_movewin.c */ extern int InitMoveWindows ( XParms xp, Parms p, int reps ); -extern void DoMoveWindows ( XParms xp, Parms p, int reps ); +extern int DoMoveWindows ( XParms xp, Parms p, int reps ); extern void EndMoveWindows ( XParms xp, Parms p ); -extern void DoResizeWindows ( XParms xp, Parms p, int reps ); +extern int DoResizeWindows ( XParms xp, Parms p, int reps ); extern int InitCircWindows ( XParms xp, Parms p, int reps ); -extern void DoCircWindows ( XParms xp, Parms p, int reps ); +extern int DoCircWindows ( XParms xp, Parms p, int reps ); extern void EndCircWindows ( XParms xp, Parms p ); extern int InitMoveTree ( XParms xp, Parms p, int reps ); -extern void DoMoveTree ( XParms xp, Parms p, int reps ); +extern int DoMoveTree ( XParms xp, Parms p, int reps ); extern void EndMoveTree ( XParms xp, Parms p ); /* do_rects.c */ extern int InitRectangles ( XParms xp, Parms p, int reps ); -extern void DoRectangles ( XParms xp, Parms p, int reps ); -extern void DoOutlineRectangles ( XParms xp, Parms p, int reps ); +extern int DoRectangles ( XParms xp, Parms p, int reps ); +extern int DoOutlineRectangles ( XParms xp, Parms p, int reps ); extern void EndRectangles ( XParms xp, Parms p ); /* do_segs.c */ @@ -259,73 +273,73 @@ extern int InitHorizSegments ( XParms xp, Parms p, int reps ); extern int InitWideHorizSegments ( XParms xp, Parms p, int reps ); extern int InitVertSegments ( XParms xp, Parms p, int reps ); extern int InitWideVertSegments ( XParms xp, Parms p, int reps ); -extern void DoSegments ( XParms xp, Parms p, int reps ); +extern int DoSegments ( XParms xp, Parms p, int reps ); extern void EndSegments ( XParms xp, Parms p ); /* do_simple.c */ -extern void DoNoOp ( XParms xp, Parms p, int reps ); -extern void DoGetAtom ( XParms xp, Parms p, int reps ); -extern void DoQueryPointer ( XParms xp, Parms p, int reps ); +extern int DoNoOp ( XParms xp, Parms p, int reps ); +extern int DoGetAtom ( XParms xp, Parms p, int reps ); +extern int DoQueryPointer ( XParms xp, Parms p, int reps ); extern int InitGetProperty ( XParms xp, Parms p, int reps ); -extern void DoGetProperty ( XParms xp, Parms p, int reps ); +extern int DoGetProperty ( XParms xp, Parms p, int reps ); /* do_text.c */ extern int InitText ( XParms xp, Parms p, int reps ); extern int InitText16 ( XParms xp, Parms p, int reps ); -extern void DoText ( XParms xp, Parms p, int reps ); -extern void DoText16 ( XParms xp, Parms p, int reps ); -extern void DoPolyText ( XParms xp, Parms p, int reps ); -extern void DoPolyText16 ( XParms xp, Parms p, int reps ); -extern void DoImageText ( XParms xp, Parms p, int reps ); -extern void DoImageText16 ( XParms xp, Parms p, int reps ); +extern int DoText ( XParms xp, Parms p, int reps ); +extern int DoText16 ( XParms xp, Parms p, int reps ); +extern int DoPolyText ( XParms xp, Parms p, int reps ); +extern int DoPolyText16 ( XParms xp, Parms p, int reps ); +extern int DoImageText ( XParms xp, Parms p, int reps ); +extern int DoImageText16 ( XParms xp, Parms p, int reps ); extern void ClearTextWin ( XParms xp, Parms p ); extern void EndText ( XParms xp, Parms p ); extern void EndText16 ( XParms xp, Parms p ); #ifdef XFT extern int InitAAText (XParms xp, Parms p, int reps ); -extern void DoAAText (XParms xp, Parms p, int reps ); +extern int DoAAText (XParms xp, Parms p, int reps ); extern void EndAAText ( XParms xp, Parms p ); #endif /* do_traps.c */ extern int InitTrapezoids ( XParms xp, Parms p, int reps ); -extern void DoTrapezoids ( XParms xp, Parms p, int reps ); +extern int DoTrapezoids ( XParms xp, Parms p, int reps ); extern void EndTrapezoids ( XParms xp, Parms p ); #ifdef XRENDER extern int InitFixedTraps ( XParms xp, Parms p, int reps ); -extern void DoFixedTraps ( XParms xp, Parms p, int reps ); +extern int DoFixedTraps ( XParms xp, Parms p, int reps ); extern void EndFixedTraps ( XParms xp, Parms p ); extern int InitFixedTrapezoids ( XParms xp, Parms p, int reps ); -extern void DoFixedTrapezoids ( XParms xp, Parms p, int reps ); +extern int DoFixedTrapezoids ( XParms xp, Parms p, int reps ); extern void EndFixedTrapezoids ( XParms xp, Parms p ); #endif /* do_tris.c */ extern int InitTriangles ( XParms xp, Parms p, int reps ); -extern void DoTriangles ( XParms xp, Parms p, int reps ); +extern int DoTriangles ( XParms xp, Parms p, int reps ); extern void EndTriangles ( XParms xp, Parms p ); /* do_valgc.c */ extern int InitGC ( XParms xp, Parms p, int reps ); -extern void DoChangeGC ( XParms xp, Parms p, int reps ); +extern int DoChangeGC ( XParms xp, Parms p, int reps ); extern void EndGC ( XParms xp, Parms p ); /* do_windows.c */ extern int CreateParents ( XParms xp, Parms p, int reps ); -extern void MapParents ( XParms xp, Parms p, int reps ); +extern int MapParents ( XParms xp, Parms p, int reps ); extern void MapParentsCleanup ( XParms xp, Parms p ); extern int InitCreate ( XParms xp, Parms p, int reps ); -extern void CreateChildren ( XParms xp, Parms p, int reps ); +extern int CreateChildren ( XParms xp, Parms p, int reps ); extern void DestroyChildren ( XParms xp, Parms p ); extern void EndCreate ( XParms xp, Parms p ); extern int InitMap ( XParms xp, Parms p, int reps ); -extern void UnmapParents ( XParms xp, Parms p, int reps ); +extern int UnmapParents ( XParms xp, Parms p, int reps ); extern void UnmapParentsCleanup ( XParms xp, Parms p); extern int InitDestroy ( XParms xp, Parms p, int reps ); -extern void DestroyParents ( XParms xp, Parms p, int reps ); +extern int DestroyParents ( XParms xp, Parms p, int reps ); extern void RenewParents ( XParms xp, Parms p ); extern int InitPopups ( XParms xp, Parms p, int reps ); -extern void DoPopUps ( XParms xp, Parms p, int reps ); +extern int DoPopUps ( XParms xp, Parms p, int reps ); extern void EndPopups ( XParms xp, Parms p ); -- 1.6.5.2 _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
