X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Falloc%2Ftiny.c;h=d782899de3d0639c11bd67d6a54a7f42e1d04f60;hp=b965eb471b329f9ff4108513f0cf10a6796c8928;hb=27ae4a224e578362fc1f4effdaabac9f112f190f;hpb=bd294f1df2a9a2a97bf32336ddd22e53e0e0b8f7 diff --git a/ccan/alloc/tiny.c b/ccan/alloc/tiny.c index b965eb47..d782899d 100755 --- a/ccan/alloc/tiny.c +++ b/ccan/alloc/tiny.c @@ -152,13 +152,13 @@ static bool long_enough(unsigned long offset, unsigned long len, static unsigned long find_free_end(unsigned char *arr, unsigned long arrsize) { - unsigned long end; + long i; - for (end = 0; end < arrsize; end++) { - if (!arr[end]) - break; + for (i = arrsize-1; i >= 0; i--) { + if (arr[i]) + return i + 1; } - return end; + return 0; } void *tiny_alloc_get(void *pool, unsigned long poolsize, @@ -186,7 +186,7 @@ void *tiny_alloc_get(void *pool, unsigned long poolsize, if (long_enough(off, len, size, align)) { /* Move every successive entry down. */ memmove(arr + fa_off, arr + fa_off + fa_hdrlen, - freelen - fa_hdrlen); + freelen - (fa_off + fa_hdrlen)); memset(arr + freelen - fa_hdrlen, 0, fa_hdrlen); goto found; }