Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

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?

UserRevisionLine numberNew 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