зеркало из https://github.com/mozilla/gecko-dev.git
Bug 794316 - PR_PushIOLayer doesn't push layer on the top correctly, r=wtc
This commit is contained in:
Родитель
ae7293140b
Коммит
57c613b5cc
|
@ -523,6 +523,11 @@ PR_IMPLEMENT(PRStatus) PR_PushIOLayer(
|
|||
*stack = *fd;
|
||||
*fd = copy;
|
||||
fd->higher = stack;
|
||||
if (fd->lower)
|
||||
{
|
||||
PR_ASSERT(fd->lower->higher == stack);
|
||||
fd->lower->higher = fd;
|
||||
}
|
||||
stack->lower = fd;
|
||||
stack->higher = NULL;
|
||||
} else {
|
||||
|
@ -561,6 +566,10 @@ PR_IMPLEMENT(PRFileDesc*) PR_PopIOLayer(PRFileDesc *stack, PRDescIdentity id)
|
|||
*stack = *extract;
|
||||
*extract = copy;
|
||||
stack->higher = NULL;
|
||||
if (stack->lower) {
|
||||
PR_ASSERT(stack->lower->higher == extract);
|
||||
stack->lower->higher = stack;
|
||||
}
|
||||
} else if ((PR_IO_LAYER_HEAD == stack->identity) &&
|
||||
(extract == stack->lower) && (extract->lower == NULL)) {
|
||||
/*
|
||||
|
|
|
@ -114,6 +114,7 @@ CSRCS = \
|
|||
provider.c \
|
||||
prpoll.c \
|
||||
prpollml.c \
|
||||
pushtop.c \
|
||||
ranfile.c \
|
||||
randseed.c \
|
||||
reinit.c \
|
||||
|
|
|
@ -0,0 +1,73 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* A regression test for bug 794316 */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "prio.h"
|
||||
|
||||
static PRIOMethods dummyMethods;
|
||||
|
||||
int main()
|
||||
{
|
||||
PRDescIdentity topId, middleId, bottomId;
|
||||
PRFileDesc *top, *middle, *bottom;
|
||||
PRFileDesc *fd;
|
||||
|
||||
topId = PR_GetUniqueIdentity("top");
|
||||
middleId = PR_GetUniqueIdentity("middle");
|
||||
bottomId = PR_GetUniqueIdentity("bottom");
|
||||
|
||||
top = PR_CreateIOLayerStub(topId, &dummyMethods);
|
||||
middle = PR_CreateIOLayerStub(middleId, &dummyMethods);
|
||||
bottom = PR_CreateIOLayerStub(bottomId, &dummyMethods);
|
||||
|
||||
fd = bottom;
|
||||
PR_PushIOLayer(fd, PR_TOP_IO_LAYER, middle);
|
||||
PR_PushIOLayer(fd, PR_TOP_IO_LAYER, top);
|
||||
|
||||
top = fd;
|
||||
middle = top->lower;
|
||||
bottom = middle->lower;
|
||||
|
||||
/* Verify that the higher pointers are correct. */
|
||||
if (middle->higher != top) {
|
||||
fprintf(stderr, "middle->higher is wrong\n");
|
||||
fprintf(stderr, "FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
if (bottom->higher != middle) {
|
||||
fprintf(stderr, "bottom->higher is wrong\n");
|
||||
fprintf(stderr, "FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
top = PR_PopIOLayer(fd, topId);
|
||||
top->dtor(top);
|
||||
|
||||
middle = fd;
|
||||
bottom = middle->lower;
|
||||
|
||||
/* Verify that the higher pointer is correct. */
|
||||
if (bottom->higher != middle) {
|
||||
fprintf(stderr, "bottom->higher is wrong\n");
|
||||
fprintf(stderr, "FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
middle = PR_PopIOLayer(fd, middleId);
|
||||
middle->dtor(middle);
|
||||
if (fd->identity != bottomId) {
|
||||
fprintf(stderr, "The bottom layer has the wrong identity\n");
|
||||
fprintf(stderr, "FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
fd->dtor(fd);
|
||||
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
|
@ -313,6 +313,7 @@ $prog = shift; # Program to test
|
|||
"primblok",
|
||||
"provider",
|
||||
"prpollml",
|
||||
"pushtop",
|
||||
"ranfile",
|
||||
"randseed",
|
||||
"reinit",
|
||||
|
|
|
@ -143,6 +143,7 @@ prftest
|
|||
primblok
|
||||
provider
|
||||
prpollml
|
||||
pushtop
|
||||
ranfile
|
||||
randseed
|
||||
reinit
|
||||
|
|
Загрузка…
Ссылка в новой задаче