[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] source code
Hi all,The following functions should compute the union, intersection and difference of two bitmaps. Please review the code. Thank you. Sincerely, Linda Jacobsonint libxl_bitmap_union(libxl_ctx *ctx, libxl_bitmap *union_bitmap, libxl_bitmap *bitmap1, libxl_bitmap *bitmap2) { int size; int rc; GC_INIT(ctx); // if bitmaps aren't the same size, union should be size of larger bit map size = (bitmap1->size > bitmap2->size) ? bitmap1->size : bitmap2->size; libxl_bitmap_init(union_bitmap); rc = libxl_bitmap_alloc(ctx, union_bitmap, size); if (rc) {// I'm following the coding standards here. First goto I've written in decades. goto out; } for (int bit = 0; bit < (size * 8); bit++) { // libxl_bitmap_test returns 0 if past end of bitmap // if the bit is set in either bitmap, set it in their union if (libxl_bitmap_test(bitmap1, bit)) { libxl_bitmap_set(union_bitmap, bit); } else if (libxl_bitmap_test(bitmap2, bit)) { libxl_bitmap_set(union_bitmap, bit); } } out: GC_FREE; return rc; }int libxl_bitmap_intersection (libxl_ctx *ctx, libxl_bitmap *union_bitmap, libxl_bitmap *bitmap1, libxl_bitmap *bitmap2) { int size; int rc; GC_INIT(ctx);// if bitmaps aren't the same size, intersection should be size of smaller bit map size = (bitmap1->size > bitmap2->size) ? bitmap2->size : bitmap1->size; libxl_bitmap_init(union_bitmap); rc = libxl_bitmap_alloc(ctx, union_bitmap, size); if (rc) { goto out; } for (int bit = 0; bit < (size * 8); bit++) { // libxl_bitmap_test returns 0 if past end of bitmap // if the bit is set in both bitmaps, set it in their intersectionif (libxl_bitmap_test (bitmap1, bit) && libxl_bitmap_test (bitmap2, bit) ) { libxl_bitmap_set (intersection_bitmap, bit); } } out: GC_FREE; return rc; }int libxl_bitmap_difference(libxl_ctx *ctx, libxl_bitmap *union_bitmap, libxl_bitmap *bitmap1, libxl_bitmap *bitmap2) { int size; int rc; GC_INIT(ctx);// if bitmaps aren't the same size, difference should be size of larger bit map size = (bitmap1->size > bitmap2->size) ? bitmap1->size : bitmap2->size; libxl_bitmap_init(union_bitmap); rc = libxl_bitmap_alloc(ctx, union_bitmap, size); if (rc) { goto out; } for (int bit = 0; bit < (size * 8); bit++) { /* libxl_bitmap_test returns 0 if past end of bitmapif the bit is set in one bitmap and not the other, set it in their difference NOTE: if one bit map is larger, this will result in all bits being set past the size of the smaller bitmap; if this is not the desired behavior, please let me know */if (libxl_bitmap_test (bitmap1, bit) && (!libxl_bitmap_test (bitmap2, bit)) ) { libxl_bitmap_set (difference_bitmap, bit); } } out: GC_FREE; return rc; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |