The Pubnub C-core library. It's home is on https://github.com/pubnub/c_core, this is a copy
Dependents: Pubnub_c_core_mbed2_pal Pubnub_c_core_mbed2_pal Pubnub_c_core_mbed2_pal2
pubnub_alloc_std.cpp@2:d85e42c1125d, 2016-11-22 (annotated)
- Committer:
- sveljko
- Date:
- Tue Nov 22 22:21:39 2016 +0000
- Revision:
- 2:d85e42c1125d
- Parent:
- 0:d13755cfb705
Added `pubnub_helper` module
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sveljko | 0:d13755cfb705 | 1 | /* -*- c-file-style:"stroustrup"; indent-tabs-mode: nil -*- */ |
sveljko | 0:d13755cfb705 | 2 | #include "pubnub_internal.h" |
sveljko | 0:d13755cfb705 | 3 | #include "pubnub_assert.h" |
sveljko | 0:d13755cfb705 | 4 | #include "pubnub_log.h" |
sveljko | 0:d13755cfb705 | 5 | |
sveljko | 0:d13755cfb705 | 6 | #include "pbpal.h" |
sveljko | 0:d13755cfb705 | 7 | |
sveljko | 0:d13755cfb705 | 8 | #include <stdlib.h> |
sveljko | 0:d13755cfb705 | 9 | #include <string.h> |
sveljko | 0:d13755cfb705 | 10 | |
sveljko | 0:d13755cfb705 | 11 | |
sveljko | 0:d13755cfb705 | 12 | #if defined PUBNUB_ASSERT_LEVEL_EX |
sveljko | 0:d13755cfb705 | 13 | static pubnub_t **m_allocated; |
sveljko | 0:d13755cfb705 | 14 | static unsigned m_n; |
sveljko | 0:d13755cfb705 | 15 | static unsigned m_cap; |
sveljko | 0:d13755cfb705 | 16 | pubnub_mutex_static_decl_and_init(m_lock); |
sveljko | 0:d13755cfb705 | 17 | #endif |
sveljko | 0:d13755cfb705 | 18 | |
sveljko | 0:d13755cfb705 | 19 | |
sveljko | 0:d13755cfb705 | 20 | static void save_allocated(pubnub_t *pb) |
sveljko | 0:d13755cfb705 | 21 | { |
sveljko | 0:d13755cfb705 | 22 | #if defined PUBNUB_ASSERT_LEVEL_EX |
sveljko | 0:d13755cfb705 | 23 | pubnub_mutex_init_static(m_lock); |
sveljko | 0:d13755cfb705 | 24 | pubnub_mutex_lock(m_lock); |
sveljko | 0:d13755cfb705 | 25 | if (m_n == m_cap) { |
sveljko | 0:d13755cfb705 | 26 | pubnub_t **npalloc = (pubnub_t**)realloc(m_allocated, sizeof m_allocated[0] * (m_n+1)); |
sveljko | 0:d13755cfb705 | 27 | if (NULL == npalloc) { |
sveljko | 0:d13755cfb705 | 28 | pubnub_mutex_unlock(m_lock); |
sveljko | 0:d13755cfb705 | 29 | return; |
sveljko | 0:d13755cfb705 | 30 | } |
sveljko | 0:d13755cfb705 | 31 | m_allocated = npalloc; |
sveljko | 0:d13755cfb705 | 32 | m_allocated[m_n++] = pb; |
sveljko | 0:d13755cfb705 | 33 | m_cap = m_n; |
sveljko | 0:d13755cfb705 | 34 | } |
sveljko | 0:d13755cfb705 | 35 | else { |
sveljko | 0:d13755cfb705 | 36 | m_allocated[m_n++] = pb; |
sveljko | 0:d13755cfb705 | 37 | } |
sveljko | 0:d13755cfb705 | 38 | pubnub_mutex_unlock(m_lock); |
sveljko | 0:d13755cfb705 | 39 | #endif |
sveljko | 0:d13755cfb705 | 40 | } |
sveljko | 0:d13755cfb705 | 41 | |
sveljko | 0:d13755cfb705 | 42 | |
sveljko | 0:d13755cfb705 | 43 | static void remove_allocated(pubnub_t *pb) |
sveljko | 0:d13755cfb705 | 44 | { |
sveljko | 0:d13755cfb705 | 45 | #if defined PUBNUB_ASSERT_LEVEL_EX |
sveljko | 0:d13755cfb705 | 46 | size_t i; |
sveljko | 0:d13755cfb705 | 47 | for (i = 0; i < m_n; ++i) { |
sveljko | 0:d13755cfb705 | 48 | if (m_allocated[i] == pb) { |
sveljko | 0:d13755cfb705 | 49 | if (i != m_n - 1) { |
sveljko | 0:d13755cfb705 | 50 | memmove(m_allocated + i, m_allocated + i + 1, sizeof m_allocated[0] * (m_n - i - 1)); |
sveljko | 0:d13755cfb705 | 51 | } |
sveljko | 0:d13755cfb705 | 52 | --m_n; |
sveljko | 0:d13755cfb705 | 53 | break; |
sveljko | 0:d13755cfb705 | 54 | } |
sveljko | 0:d13755cfb705 | 55 | } |
sveljko | 0:d13755cfb705 | 56 | #endif |
sveljko | 0:d13755cfb705 | 57 | } |
sveljko | 0:d13755cfb705 | 58 | |
sveljko | 0:d13755cfb705 | 59 | |
sveljko | 0:d13755cfb705 | 60 | static bool check_ctx_ptr(pubnub_t const *pb) |
sveljko | 0:d13755cfb705 | 61 | { |
sveljko | 0:d13755cfb705 | 62 | #if defined PUBNUB_ASSERT_LEVEL_EX |
sveljko | 0:d13755cfb705 | 63 | size_t i; |
sveljko | 0:d13755cfb705 | 64 | for (i = 0; i < m_n; ++i) { |
sveljko | 0:d13755cfb705 | 65 | if (m_allocated[i] == pb) { |
sveljko | 0:d13755cfb705 | 66 | return true; |
sveljko | 0:d13755cfb705 | 67 | } |
sveljko | 0:d13755cfb705 | 68 | } |
sveljko | 0:d13755cfb705 | 69 | return false; |
sveljko | 0:d13755cfb705 | 70 | #else |
sveljko | 0:d13755cfb705 | 71 | return pb != NULL; |
sveljko | 0:d13755cfb705 | 72 | #endif |
sveljko | 0:d13755cfb705 | 73 | } |
sveljko | 0:d13755cfb705 | 74 | |
sveljko | 0:d13755cfb705 | 75 | |
sveljko | 0:d13755cfb705 | 76 | bool pb_valid_ctx_ptr(pubnub_t const *pb) |
sveljko | 0:d13755cfb705 | 77 | { |
sveljko | 0:d13755cfb705 | 78 | #if defined PUBNUB_ASSERT_LEVEL_EX |
sveljko | 0:d13755cfb705 | 79 | bool result; |
sveljko | 0:d13755cfb705 | 80 | |
sveljko | 0:d13755cfb705 | 81 | pubnub_mutex_init_static(m_lock); |
sveljko | 0:d13755cfb705 | 82 | pubnub_mutex_lock(m_lock); |
sveljko | 0:d13755cfb705 | 83 | result = check_ctx_ptr(pb); |
sveljko | 0:d13755cfb705 | 84 | pubnub_mutex_unlock(m_lock); |
sveljko | 0:d13755cfb705 | 85 | |
sveljko | 0:d13755cfb705 | 86 | return result; |
sveljko | 0:d13755cfb705 | 87 | #else |
sveljko | 0:d13755cfb705 | 88 | return pb != NULL; |
sveljko | 0:d13755cfb705 | 89 | #endif |
sveljko | 0:d13755cfb705 | 90 | } |
sveljko | 0:d13755cfb705 | 91 | |
sveljko | 0:d13755cfb705 | 92 | |
sveljko | 0:d13755cfb705 | 93 | pubnub_t *pubnub_alloc(void) |
sveljko | 0:d13755cfb705 | 94 | { |
sveljko | 0:d13755cfb705 | 95 | pubnub_t *pb = (pubnub_t*)malloc(sizeof(pubnub_t)); |
sveljko | 0:d13755cfb705 | 96 | if (pb != NULL) { |
sveljko | 0:d13755cfb705 | 97 | save_allocated(pb); |
sveljko | 0:d13755cfb705 | 98 | } |
sveljko | 0:d13755cfb705 | 99 | return pb; |
sveljko | 0:d13755cfb705 | 100 | } |
sveljko | 0:d13755cfb705 | 101 | |
sveljko | 0:d13755cfb705 | 102 | |
sveljko | 0:d13755cfb705 | 103 | void pballoc_free_at_last(pubnub_t *pb) |
sveljko | 0:d13755cfb705 | 104 | { |
sveljko | 0:d13755cfb705 | 105 | PUBNUB_ASSERT_OPT(pb != NULL); |
sveljko | 0:d13755cfb705 | 106 | |
sveljko | 0:d13755cfb705 | 107 | pubnub_mutex_init_static(m_lock); |
sveljko | 0:d13755cfb705 | 108 | pubnub_mutex_lock(m_lock); |
sveljko | 0:d13755cfb705 | 109 | pubnub_mutex_lock(pb->monitor); |
sveljko | 0:d13755cfb705 | 110 | |
sveljko | 0:d13755cfb705 | 111 | PUBNUB_ASSERT_OPT(pb->state == PBS_NULL); |
sveljko | 0:d13755cfb705 | 112 | |
sveljko | 0:d13755cfb705 | 113 | pbcc_deinit(&pb->core); |
sveljko | 0:d13755cfb705 | 114 | pbpal_free(pb); |
sveljko | 0:d13755cfb705 | 115 | remove_allocated(pb); |
sveljko | 0:d13755cfb705 | 116 | pubnub_mutex_unlock(m_lock); |
sveljko | 0:d13755cfb705 | 117 | pubnub_mutex_unlock(pb->monitor); |
sveljko | 0:d13755cfb705 | 118 | pubnub_mutex_destroy(pb->monitor); |
sveljko | 0:d13755cfb705 | 119 | free(pb); |
sveljko | 0:d13755cfb705 | 120 | } |
sveljko | 0:d13755cfb705 | 121 | |
sveljko | 0:d13755cfb705 | 122 | |
sveljko | 0:d13755cfb705 | 123 | int pubnub_free(pubnub_t *pb) |
sveljko | 0:d13755cfb705 | 124 | { |
sveljko | 0:d13755cfb705 | 125 | int result = -1; |
sveljko | 0:d13755cfb705 | 126 | |
sveljko | 0:d13755cfb705 | 127 | PUBNUB_ASSERT(check_ctx_ptr(pb)); |
sveljko | 0:d13755cfb705 | 128 | |
sveljko | 0:d13755cfb705 | 129 | pubnub_mutex_lock(pb->monitor); |
sveljko | 0:d13755cfb705 | 130 | if (PBS_IDLE == pb->state) { |
sveljko | 0:d13755cfb705 | 131 | pb->state = PBS_NULL; |
sveljko | 0:d13755cfb705 | 132 | #if defined(PUBNUB_CALLBACK_API) |
sveljko | 0:d13755cfb705 | 133 | pbntf_requeue_for_processing(pb); |
sveljko | 0:d13755cfb705 | 134 | pubnub_mutex_unlock(pb->monitor); |
sveljko | 0:d13755cfb705 | 135 | #else |
sveljko | 0:d13755cfb705 | 136 | pubnub_mutex_unlock(pb->monitor); |
sveljko | 0:d13755cfb705 | 137 | pballoc_free_at_last(pb); |
sveljko | 0:d13755cfb705 | 138 | #endif |
sveljko | 0:d13755cfb705 | 139 | |
sveljko | 0:d13755cfb705 | 140 | result = 0; |
sveljko | 0:d13755cfb705 | 141 | } |
sveljko | 0:d13755cfb705 | 142 | else { |
sveljko | 0:d13755cfb705 | 143 | pubnub_mutex_unlock(pb->monitor); |
sveljko | 0:d13755cfb705 | 144 | } |
sveljko | 0:d13755cfb705 | 145 | |
sveljko | 0:d13755cfb705 | 146 | return result; |
sveljko | 0:d13755cfb705 | 147 | } |