Exemple #1
0
void ongr_line( frame *f, onpoint *p1, onpoint *p2 )
{
  onpoint abs1,abs2;
  r2a(f,p1,&abs1);
  r2a(f,p2,&abs2);
  ag_line(abs1.x,abs1.y,abs2.x,abs2.y);
}
Exemple #2
0
void ongr_bar( frame *f, onpoint *p1, onpoint *p2 )
{
  onpoint abs1,abs2;
  r2a(f,p1,&abs1);
  r2a(f,p2,&abs2);
  ag_rectangle(abs1.x,abs1.y,abs2.x,abs2.y);
}
Exemple #3
0
/*
 * malloc - allocate a block with at least size bytes of payload
 */
void *malloc (size_t size) {
    size_t total_size; /* include prologue and epilogue */
    unsigned *list_p;
    void *bp;

    dbg_printf("want to malloc(%d)\n", (int)size);
    print_heap();

    /* initialize */
    if (!heap_head) {
       mm_init();
    }

    /* calculate total block size */
    if (size <= 0) {
        return NULL;
    } else if (size <= 3 * WSIZE) {
        total_size = 4 * WSIZE;
    } else {
        total_size = DSIZE * ((size + WSIZE + DSIZE - 1) / DSIZE);
    }

    /* get corresponding free list */
    list_p = get_list(total_size);
    if (list_p == NULL) {
        return NULL;
    }

    /* try to find a block big enough */
    while (list_p != array_tail) {
        bp = (void *)(size_t)*list_p;
        while (bp != NULL) {
            if (block_size((void *)r2a((size_t)bp)) >= total_size) {
                place((void *)r2a((size_t)bp), total_size);
                dbg_printf("want to return 0x%x from malloc(%d) after find a block big enough \n", (int)bp, (int)size);
                print_heap();
                return (void *)r2a((size_t)bp);
            }
            bp = succ_block((void *)r2a((size_t)bp));
        }
        list_p++;
    }

    /* if there is no appropriate block, then extend heap */
    bp = extend_heap(MAX(total_size, 64));
    dbg_printf("just after extend heap\n");
    print_heap();
    if (bp == NULL) {
        return NULL;
    }
    place(bp, total_size);

    dbg_printf("want to return 0x%x from malloc(%d) and can't find big enough block\n", (int)bp, (int)size);
    print_heap();
    return (void *)r2a((size_t)bp);
}
Exemple #4
0
void ongr_framed_box( frame *f, onpoint *p1, onpoint *p2 , int col)
{
  onpoint abs1,abs2;
  int old_col = ag_pen_color();
  r2a(f,p1,&abs1);
  r2a(f,p2,&abs2);
  ag_set_pen_color(col);
  ag_box(abs1.x,abs1.y,abs2.x,abs2.y);
  ag_set_pen_color(AG_BLACK);
  ag_rectangle(abs1.x,abs1.y,abs2.x,abs2.y);
  ag_set_pen_color(old_col);
}
Exemple #5
0
void ongr_cross( frame *f, onpoint *p )
{
  onpoint abs;
  r2a(f,p,&abs);
  ag_line(abs.x-2.0,abs.y,abs.x+2.0,abs.y);  
  ag_line(abs.x,abs.y-2.0,abs.x,abs.y+2.0);  
}
Exemple #6
0
void ongr_dot( frame *f, onpoint *p )
{
  onpoint abs;
  double bw = real_min(frame_width(f),frame_height(f))/150.0;
  bw = real_max(DOT_RADIUS * 0.75,real_min(1.5 * DOT_RADIUS,bw));
  r2a(f,p,&abs);
  ag_disc(abs.x,abs.y,bw);
}
Exemple #7
0
/*
 * mm_checkheap
 */
void mm_checkheap(int verbose){
    void *bp;
    unsigned *list_p;
    unsigned *pred, *succ;
    int i;
    if (!verbose) {
        return;
    }
    bp = data_head + DSIZE;
    /* checking the heap */
    /* prologue */
    if (!(block_size(bp) == 8 && block_alloc(bp) == 1)) {
        printf("Invariant Error: prologue block\n");
    }
    /* blocks */
    bp = next_block(bp);
    while (block_size(bp) != 0) {
        if ((long)bp % DSIZE != 0) {
            printf("Invariant Error: block's address isn't aligned\n");
        }
        if (!block_alloc(bp)) {
            if (*(int *)HEAD(bp) != *(int *)FOOT(bp)) {
                printf("Invariant Error: block head and foot don't match\n");
            }
        }
        if (!block_prev_alloc(bp)) {
            if (block_prev_alloc(bp) != block_alloc(prev_block(bp))) {
                printf("Invariant Error: prev alloc bit doesn't match prev block\n");
            }
            if (block_alloc(bp) == 0) {
                printf("Inveriant Error: find consecutive free blocks\n");
            }
        }
        if (block_alloc(bp) == 0 && block_alloc(next_block(bp)) == 0) {
            printf("Inveriant Error: find consecutive free blocks\n");
        }
        if (block_size(bp) < 4 * WSIZE) {
            printf("Invariant Error: block is too small\n");
        }
        bp = next_block(bp);
    } 
    /* epilogue */
    if (!(block_size(bp) == 0 && block_alloc(bp) == 1)) {
        printf("Invariant Error: epilogue block\n");
    }

    /* checking the free list */
    list_p = (unsigned *)heap_head;
    for (i = 0; i < ARRAYSIZE; i++) {
        if (!*list_p) {
            continue;
        }
        bp = (unsigned *)r2a((size_t)*list_p);
        while (bp != NULL) {
            pred = pred_block(bp);
            succ = succ_block(bp);
            if (pred != NULL) {
                if (*(pred + 1) != a2r((size_t)bp)) {
                    printf("Invariant Error: inconsistent pointer\n");
                }
            }
            if (succ != NULL) {
                if (*succ != a2r((size_t)bp)) {
                    printf("Invariant Error: inconsistent pointer\n");
                }
            }
            if (get_list(block_size((void *)bp)) != list_p) {
                printf("Invariant Error: block size doesn't match list\n");
            }
            bp = succ;
        }
        list_p++;
    }
    print_heap();
}
Exemple #8
0
void ongr_print( frame *f, onpoint *p, char *string )
{
  onpoint abs;
  r2a(f,p,&abs);
  ag_print(abs.x,abs.y,string);
}
Exemple #9
0
void ongr_disc( frame *f, onpoint *p, double r )
{
  onpoint abs;
  r2a(f,p,&abs);
  ag_disc(abs.x,abs.y,r);
}
Exemple #10
0
void ongr_circle( frame *f, onpoint *p, double r )
{
  onpoint abs;
  r2a(f,p,&abs);
  ag_circle(abs.x,abs.y,r);
}
Exemple #11
0
void ongr_pixel( frame *f, onpoint *p )
{
  onpoint abs;
  r2a(f,p,&abs);
  ag_pixel(abs.x,abs.y);
}