Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
c-utility/inc/azure_c_shared_utility/refcount.h@0:f7f1f0d76dd6, 2018-08-23 (annotated)
- Committer:
- XinZhangMS
- Date:
- Thu Aug 23 06:52:14 2018 +0000
- Revision:
- 0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
XinZhangMS | 0:f7f1f0d76dd6 | 1 | // Copyright (c) Microsoft. All rights reserved. |
XinZhangMS | 0:f7f1f0d76dd6 | 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. |
XinZhangMS | 0:f7f1f0d76dd6 | 3 | |
XinZhangMS | 0:f7f1f0d76dd6 | 4 | |
XinZhangMS | 0:f7f1f0d76dd6 | 5 | /*this header contains macros for ref_counting a variable. |
XinZhangMS | 0:f7f1f0d76dd6 | 6 | |
XinZhangMS | 0:f7f1f0d76dd6 | 7 | There are no upper bound checks related to uint32_t overflow because we expect that bigger issues are in |
XinZhangMS | 0:f7f1f0d76dd6 | 8 | the system when more than 4 billion references exist to the same variable. In the case when such an overflow |
XinZhangMS | 0:f7f1f0d76dd6 | 9 | occurs, the object's ref count will reach zero (while still having 0xFFFFFFFF references) and likely the |
XinZhangMS | 0:f7f1f0d76dd6 | 10 | controlling code will take the decision to free the object's resources. Then, any of the 0xFFFFFFFF references |
XinZhangMS | 0:f7f1f0d76dd6 | 11 | will interact with deallocated memory / resources resulting in an undefined behavior. |
XinZhangMS | 0:f7f1f0d76dd6 | 12 | */ |
XinZhangMS | 0:f7f1f0d76dd6 | 13 | |
XinZhangMS | 0:f7f1f0d76dd6 | 14 | #ifndef REFCOUNT_H |
XinZhangMS | 0:f7f1f0d76dd6 | 15 | #define REFCOUNT_H |
XinZhangMS | 0:f7f1f0d76dd6 | 16 | |
XinZhangMS | 0:f7f1f0d76dd6 | 17 | #include "azure_c_shared_utility/gballoc.h" |
XinZhangMS | 0:f7f1f0d76dd6 | 18 | #include "azure_c_shared_utility/macro_utils.h" |
XinZhangMS | 0:f7f1f0d76dd6 | 19 | |
XinZhangMS | 0:f7f1f0d76dd6 | 20 | #ifdef __cplusplus |
XinZhangMS | 0:f7f1f0d76dd6 | 21 | #include <cstdlib> |
XinZhangMS | 0:f7f1f0d76dd6 | 22 | #include <cstdint> |
XinZhangMS | 0:f7f1f0d76dd6 | 23 | extern "C" |
XinZhangMS | 0:f7f1f0d76dd6 | 24 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 25 | #else |
XinZhangMS | 0:f7f1f0d76dd6 | 26 | #include <stdlib.h> |
XinZhangMS | 0:f7f1f0d76dd6 | 27 | #include <stdint.h> |
XinZhangMS | 0:f7f1f0d76dd6 | 28 | #endif |
XinZhangMS | 0:f7f1f0d76dd6 | 29 | |
XinZhangMS | 0:f7f1f0d76dd6 | 30 | // Include the platform-specific file that defines atomic functionality |
XinZhangMS | 0:f7f1f0d76dd6 | 31 | #include "refcount_os.h" |
XinZhangMS | 0:f7f1f0d76dd6 | 32 | |
XinZhangMS | 0:f7f1f0d76dd6 | 33 | #define REFCOUNT_TYPE(type) \ |
XinZhangMS | 0:f7f1f0d76dd6 | 34 | struct C2(C2(REFCOUNT_, type), _TAG) |
XinZhangMS | 0:f7f1f0d76dd6 | 35 | |
XinZhangMS | 0:f7f1f0d76dd6 | 36 | #define REFCOUNT_SHORT_TYPE(type) \ |
XinZhangMS | 0:f7f1f0d76dd6 | 37 | C2(REFCOUNT_, type) |
XinZhangMS | 0:f7f1f0d76dd6 | 38 | |
XinZhangMS | 0:f7f1f0d76dd6 | 39 | #define REFCOUNT_TYPE_DECLARE_CREATE(type) C2(REFCOUNT_SHORT_TYPE(type), _Create) |
XinZhangMS | 0:f7f1f0d76dd6 | 40 | #define REFCOUNT_TYPE_CREATE(type) C2(REFCOUNT_SHORT_TYPE(type), _Create)() |
XinZhangMS | 0:f7f1f0d76dd6 | 41 | |
XinZhangMS | 0:f7f1f0d76dd6 | 42 | /*this introduces a new refcount'd type based on another type */ |
XinZhangMS | 0:f7f1f0d76dd6 | 43 | /*and an initializer for that new type that also sets the ref count to 1. The type must not have a flexible array*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 44 | /*the newly allocated memory shall be free'd by free()*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 45 | /*and the ref counting is handled internally by the type in the _Create/ _Clone /_Destroy functions */ |
XinZhangMS | 0:f7f1f0d76dd6 | 46 | |
XinZhangMS | 0:f7f1f0d76dd6 | 47 | #define DEFINE_REFCOUNT_TYPE(type) \ |
XinZhangMS | 0:f7f1f0d76dd6 | 48 | REFCOUNT_TYPE(type) \ |
XinZhangMS | 0:f7f1f0d76dd6 | 49 | { \ |
XinZhangMS | 0:f7f1f0d76dd6 | 50 | type counted; \ |
XinZhangMS | 0:f7f1f0d76dd6 | 51 | COUNT_TYPE count; \ |
XinZhangMS | 0:f7f1f0d76dd6 | 52 | }; \ |
XinZhangMS | 0:f7f1f0d76dd6 | 53 | static type* REFCOUNT_TYPE_DECLARE_CREATE(type) (void) \ |
XinZhangMS | 0:f7f1f0d76dd6 | 54 | { \ |
XinZhangMS | 0:f7f1f0d76dd6 | 55 | REFCOUNT_TYPE(type)* result = (REFCOUNT_TYPE(type)*)malloc(sizeof(REFCOUNT_TYPE(type))); \ |
XinZhangMS | 0:f7f1f0d76dd6 | 56 | if (result != NULL) \ |
XinZhangMS | 0:f7f1f0d76dd6 | 57 | { \ |
XinZhangMS | 0:f7f1f0d76dd6 | 58 | result->count = 1; \ |
XinZhangMS | 0:f7f1f0d76dd6 | 59 | } \ |
XinZhangMS | 0:f7f1f0d76dd6 | 60 | return (type*)result; \ |
XinZhangMS | 0:f7f1f0d76dd6 | 61 | } \ |
XinZhangMS | 0:f7f1f0d76dd6 | 62 | |
XinZhangMS | 0:f7f1f0d76dd6 | 63 | #ifndef DEC_RETURN_ZERO |
XinZhangMS | 0:f7f1f0d76dd6 | 64 | #error refcount_os.h does not define DEC_RETURN_ZERO |
XinZhangMS | 0:f7f1f0d76dd6 | 65 | #endif // !DEC_RETURN_ZERO |
XinZhangMS | 0:f7f1f0d76dd6 | 66 | #ifndef INC_REF |
XinZhangMS | 0:f7f1f0d76dd6 | 67 | #error refcount_os.h does not define INC_REF |
XinZhangMS | 0:f7f1f0d76dd6 | 68 | #endif // !INC_REF |
XinZhangMS | 0:f7f1f0d76dd6 | 69 | #ifndef DEC_REF |
XinZhangMS | 0:f7f1f0d76dd6 | 70 | #error refcount_os.h does not define DEC_REF |
XinZhangMS | 0:f7f1f0d76dd6 | 71 | #endif // !DEC_REF |
XinZhangMS | 0:f7f1f0d76dd6 | 72 | #ifndef INIT_REF |
XinZhangMS | 0:f7f1f0d76dd6 | 73 | #error refcount_os.h does not define INIT_REF |
XinZhangMS | 0:f7f1f0d76dd6 | 74 | #endif // !INIT_REF |
XinZhangMS | 0:f7f1f0d76dd6 | 75 | |
XinZhangMS | 0:f7f1f0d76dd6 | 76 | #ifdef __cplusplus |
XinZhangMS | 0:f7f1f0d76dd6 | 77 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 78 | #endif |
XinZhangMS | 0:f7f1f0d76dd6 | 79 | |
XinZhangMS | 0:f7f1f0d76dd6 | 80 | #endif /*REFCOUNT_H*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 81 | |
XinZhangMS | 0:f7f1f0d76dd6 | 82 |