diff options
| author | Karsten Schmidt <k@postspectacular.com> | 2017-07-15 04:15:48 +0100 |
|---|---|---|
| committer | Karsten Schmidt <k@postspectacular.com> | 2017-07-15 04:15:48 +0100 |
| commit | ad2d638edca988b17ffb388e55e735093c52f36c (patch) | |
| tree | 74137665b170a7b6c420247d2f9e2cfe85fca949 | |
| parent | 1c06015c61c0b5b1a3e67f87b13d73c57209d59d (diff) | |
add TA_DISABLE_* defines, update compact, memclear, add license, update readme
| -rw-r--r-- | LICENSE | 201 | ||||
| -rw-r--r-- | README.md | 8 | ||||
| -rw-r--r-- | tinyalloc.c | 60 | ||||
| -rw-r--r-- | tinyalloc.h | 27 |
4 files changed, 252 insertions, 44 deletions
@@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. @@ -58,6 +58,8 @@ Structural validation. Returns `true` if internal heap structure is ok. | `TA_ALIGN` | 8 | Word size for pointer alignment | | `TA_BASE` | 0x400 | Address of **tinyalloc** control data structure | | `TA_DEBUG` | undefined | Trace debug information | +| `TA_DISABLE_COMPACT` | undefined | Disable free block compaction | +| `TA_DISABLE_SPLIT` | undefined | Disable free block splitting during re-alloc | | `TA_HEAP_START` | 0x1010 | Heap space start address | | `TA_HEAP_LIMIT` | 0xffffff | Heap space end address | | `TA_HEAP_BLOCKS` | 256 | Max. number of memory chunks | @@ -80,7 +82,7 @@ If building in debug mode (if `TA_DEBUG` symbol is defined), two externally defi (Requires [emscripten](http://emscripten.org)) ```sh -emcc -Os -s WASM=1 -s SIDE_MODULE=1 -o tinyalloc.wasm tinyalloc.c +emcc -Oz -s WASM=1 -s SIDE_MODULE=1 -o tinyalloc.wasm tinyalloc.c ``` #### Disassemble to WAST @@ -90,3 +92,7 @@ emcc -Os -s WASM=1 -s SIDE_MODULE=1 -o tinyalloc.wasm tinyalloc.c ```sh wasm2wast --generate-names tinyalloc.wasm > tinyalloc.wast ``` + +## License + +© 2016 - 2017 Karsten Schmidt - Apache Software License 2.0 (see [LICENSE](./LICENSE))
\ No newline at end of file diff --git a/tinyalloc.c b/tinyalloc.c index 1eeb614..93d568d 100644 --- a/tinyalloc.c +++ b/tinyalloc.c @@ -1,4 +1,29 @@ #include "tinyalloc.h" +#include <stdint.h> + +#ifndef TA_ALIGN +#define TA_ALIGN 8 +#endif + +#ifndef TA_BASE +#define TA_BASE 0x400 +#endif + +#ifndef TA_HEAP_START +#define TA_HEAP_START (TA_BASE + sizeof(Heap)) +#endif + +#ifndef TA_HEAP_LIMIT +#define TA_HEAP_LIMIT (1 << 24) +#endif + +#ifndef TA_HEAP_BLOCKS +#define TA_HEAP_BLOCKS 256 +#endif + +#ifndef TA_SPLIT_THRESH +#define TA_SPLIT_THRESH 16 +#endif #ifdef TA_DEBUG extern void print_s(char *); @@ -60,16 +85,17 @@ static void release_blocks(Block *scan, Block *to) { print_i((size_t)scan); scan_next = scan->next; scan->next = heap->fresh; + heap->fresh = scan; scan->addr = 0; scan->size = 0; - heap->fresh = scan; scan = scan_next; } } +#ifndef TA_DISABLE_COMPACT static void compact() { - Block *ptr = heap->free; - Block *prev = NULL; + Block *ptr = heap->free; + Block *prev; Block *scan; while (ptr != NULL) { prev = ptr; @@ -92,12 +118,11 @@ static void compact() { release_blocks(ptr->next, prev->next); // relink ptr->next = next; - ptr = next; - } else { - ptr = ptr->next; } + ptr = ptr->next; } } +#endif bool ta_init() { heap->free = NULL; @@ -124,7 +149,9 @@ bool ta_free(void *free) { heap->used = block->next; } insert_block(block); +#ifndef TA_DISABLE_COMPACT compact(); +#endif return true; } prev = block; @@ -152,6 +179,7 @@ static Block *alloc_block(size_t num) { print_s("resize top block"); ptr->size = num; heap->top = (size_t)ptr->addr + num; +#ifndef TA_DISABLE_SPLIT } else if (heap->fresh != NULL) { size_t excess = ptr->size - num; if (excess >= TA_SPLIT_THRESH) { @@ -163,8 +191,11 @@ static Block *alloc_block(size_t num) { print_i((size_t)split->addr); split->size = excess; insert_block(split); +#ifndef TA_DISABLE_COMPACT compact(); +#endif } +#endif } return ptr; } @@ -195,21 +226,16 @@ void *ta_alloc(size_t num) { return NULL; } -static void memset(void *ptr, uint8_t c, size_t num) { +static void memclear(void *ptr, size_t num) { size_t *ptrw = (size_t *)ptr; size_t numw = (num & -sizeof(size_t)) / sizeof(size_t); - size_t cw = c; - cw = (cw << 24) | (cw << 16) | (cw << 8) | cw; -#ifdef __LP64__ - cw |= (cw << 32); -#endif while (numw--) { - *ptrw++ = cw; + *ptrw++ = 0; } num &= (sizeof(size_t) - 1); uint8_t *ptrb = (uint8_t *)ptrw; while (num--) { - *ptrb++ = c; + *ptrb++ = 0; } } @@ -217,7 +243,7 @@ void *ta_calloc(size_t num, size_t size) { num *= size; Block *block = alloc_block(num); if (block != NULL) { - memset(block->addr, 0, num); + memclear(block->addr, num); return block->addr; } return NULL; @@ -240,10 +266,10 @@ size_t ta_num_used() { return count_blocks(heap->used); } -size_t ta_num_avail() { +size_t ta_num_fresh() { return count_blocks(heap->fresh); } bool ta_check() { - return TA_HEAP_BLOCKS == ta_num_free() + ta_num_used() + ta_num_avail(); + return TA_HEAP_BLOCKS == ta_num_free() + ta_num_used() + ta_num_fresh(); } diff --git a/tinyalloc.h b/tinyalloc.h index 997dc74..6a76d2a 100644 --- a/tinyalloc.h +++ b/tinyalloc.h @@ -1,30 +1,5 @@ #include <stdbool.h> #include <stddef.h> -#include <stdint.h> - -#ifndef TA_ALIGN -#define TA_ALIGN 8 -#endif - -#ifndef TA_BASE -#define TA_BASE 0x400 -#endif - -#ifndef TA_HEAP_START -#define TA_HEAP_START (TA_BASE + sizeof(Heap)) -#endif - -#ifndef TA_HEAP_LIMIT -#define TA_HEAP_LIMIT (1 << 24) -#endif - -#ifndef TA_HEAP_BLOCKS -#define TA_HEAP_BLOCKS 256 -#endif - -#ifndef TA_SPLIT_THRESH -#define TA_SPLIT_THRESH 16 -#endif bool ta_init(); void *ta_alloc(size_t num); @@ -33,5 +8,5 @@ bool ta_free(void *ptr); size_t ta_num_free(); size_t ta_num_used(); -size_t ta_num_avail(); +size_t ta_num_fresh(); bool ta_check(); |
