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

Committer:
sveljko
Date:
Thu Nov 10 22:20:11 2016 +0000
Revision:
0:d13755cfb705
Initial commit of Pubnub C-core

Who changed what in which revision?

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