From 2117dc433abc11b526b74ffb32de851f1d82dee9 Mon Sep 17 00:00:00 2001 From: fctom1215 <fctom1215@outlook.com> Date: 星期一, 03 二月 2020 22:09:55 +0800 Subject: [PATCH] 重写了消息事件部分,之前的缺乏线程安全可能导致崩溃。 --- lib/src/main/cpp/native-lib.cpp | 2 lib/src/main/cpp/rtk_module/virtual_rtk.cpp | 4 + lib/src/main/cpp/rtk_platform/platform.cpp | 146 ++++++++++++++++++++++++++++++++---------------- 3 files changed, 101 insertions(+), 51 deletions(-) diff --git a/lib/src/main/cpp/native-lib.cpp b/lib/src/main/cpp/native-lib.cpp index a605f17..760751c 100644 --- a/lib/src/main/cpp/native-lib.cpp +++ b/lib/src/main/cpp/native-lib.cpp @@ -245,7 +245,7 @@ InitPlatform(phone, RTK_PLATFORM_IP, RTK_PLATFORM_PORT); AppTimer_add(SendBootIndicate, 500); - InitVirtualDevice("192.168.16.104", 9001); + InitVirtualDevice("192.168.3.52", 9001); } static void SendBootIndicate(union sigval sig) { diff --git a/lib/src/main/cpp/rtk_module/virtual_rtk.cpp b/lib/src/main/cpp/rtk_module/virtual_rtk.cpp index da1baa7..903255b 100644 --- a/lib/src/main/cpp/rtk_module/virtual_rtk.cpp +++ b/lib/src/main/cpp/rtk_module/virtual_rtk.cpp @@ -55,6 +55,10 @@ fd = ConnectTCP(vs->domain_name, vs->port); + if (fd > 0) { + DEBUG("铏氭嫙骞冲彴杩炴帴鎴愬姛"); + } + while (fd > 0) { tv.tv_sec = 5; tv.tv_usec = 0; diff --git a/lib/src/main/cpp/rtk_platform/platform.cpp b/lib/src/main/cpp/rtk_platform/platform.cpp index 833dd63..322708f 100644 --- a/lib/src/main/cpp/rtk_platform/platform.cpp +++ b/lib/src/main/cpp/rtk_platform/platform.cpp @@ -53,17 +53,18 @@ uint32_t downloadRtk : 1; } platformStatus; -static struct event_queue_t { - uint32_t event; +struct event_t { + uint32_t id; int length; void *data; +}; + +static struct event_queue_t { + struct event_t event; struct event_queue_t *next; } *eventQueue; struct platformSocket exceptSocket, currSocket; -static uint32_t eventMask; -static void *eventData[32]; -static int eventDataLength[32]; static sem_t sem_status_changed; static bool requestPlatformSendRtk = false; @@ -71,6 +72,10 @@ static pthread_mutex_t platform_tx_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t events_mutex = PTHREAD_MUTEX_INITIALIZER; + +static void AddEvnet(uint32_t event, const uint8_t *data, int length); +static struct event_t * FetchEvent(void); +static void RemoveEvent(void); static void ReqRtkPlatformConfigTimeout(union sigval sig); @@ -89,22 +94,71 @@ static void TriggerHeartbeat(union sigval sig); static void RequestRtkNoResp(union sigval sig); -void AddEvnet(uint32_t event, const uint8_t *data, int length) +static void AddEvnet(uint32_t event, const uint8_t *data, int length) { + DEBUG("AddEvnet 0x%04X length %d", event, length); + + struct event_queue_t *nw = (struct event_queue_t *)malloc(sizeof(struct event_queue_t)); + nw->next = NULL; + + nw->event.id = event; + nw->event.data = NULL; + nw->event.length = 0; + + if (data != NULL && length > 0) { + nw->event.data = malloc(length); + nw->event.length = length; + memcpy(nw->event.data, data, length); + } + + pthread_mutex_lock(&events_mutex); + struct event_queue_t *p = eventQueue; - while (p != NULL) { - struct event_queue_t *nw = (struct event_queue_t *)malloc(sizeof(struct event_queue_t)); + while (p != NULL && p->next != NULL) p = p->next; - nw->event = event; - nw->next = NULL; - nw->data = NULL; - nw->length = 0; - if (data != NULL && length > 0) { - nw->data = malloc(length); - nw->length = length; - } + if (eventQueue == NULL) + eventQueue = nw; + else + p->next = nw; + + pthread_mutex_unlock(&events_mutex); +} + +static struct event_t * FetchEvent(void) +{ + struct event_t *evp = NULL; + + pthread_mutex_lock(&events_mutex); + struct event_queue_t *p = eventQueue; + + if (p != NULL) { + evp = &p->event; } + + pthread_mutex_unlock(&events_mutex); + + return evp; +} + +static void RemoveEvent(void) +{ + void *p1 = NULL, *p2 = NULL; + + pthread_mutex_lock(&events_mutex); + struct event_queue_t *p = eventQueue; + + if (p != NULL) { + eventQueue = p->next; + p1 = p; + p2 = p->event.data; + } + pthread_mutex_unlock(&events_mutex); + + if (p2 != NULL) + free(p2); + if (p1 != NULL) + free(p1); } void InitPlatform(const uint8_t *phone, const char *domain_name, int port) @@ -116,9 +170,6 @@ eventQueue = NULL; - eventMask = 0; - memset(eventData, 0, sizeof(eventData)); - memset(eventDataLength, 0, sizeof(eventDataLength)); platform_tcp_fd = -1; memset(&currSocket, 0, sizeof(currSocket)); @@ -133,6 +184,26 @@ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached pthread_create(&pid, &attr, StatusListenThread, NULL); + + + AddEvnet(100, (uint8_t *)"1234567890", 11); + AddEvnet(101, (uint8_t *)"abcd", 5); + AddEvnet(102, (uint8_t *)"xyz", 4); + AddEvnet(104, NULL, 0); + AddEvnet(105, (uint8_t *)"uio", 4); + + while (true) { + struct event_t *evp = FetchEvent(); + + if (evp != NULL) { + DEBUG("寰楀埌event %d %d", evp->id, evp->length); + + if (evp->data != NULL) + DEBUG("鏁版嵁 %s", evp->data); + RemoveEvent(); + } else + break; + } } static void ReqRtkPlatformConfigTimeout(union sigval sig) @@ -179,20 +250,7 @@ void PlatformStatusChanged(uint32_t event, const uint8_t *data, int length) { - if (data != NULL && length > 0) { - int x = BitCount(event-1); - - if (eventData[x] != NULL) free(eventData[x]); - eventData[x] = malloc(length); - memcpy(eventData[x], data, length); - eventDataLength[x] = length; - -// DEBUG("ADD %d len %d", x, length); - } - - pthread_mutex_lock(&events_mutex); - eventMask |= event; - pthread_mutex_unlock(&events_mutex); + AddEvnet(event, data, length); sem_post(&sem_status_changed); } @@ -229,25 +287,13 @@ while (true) { sem_wait(&sem_status_changed); - uint32_t events; - pthread_mutex_lock(&events_mutex); - events = eventMask; - eventMask = 0; - pthread_mutex_unlock(&events_mutex); + struct event_t *evp = FetchEvent(); - while (events > 0) { - int x = BitCount(((events - 1) ^ events) - 1); - -// DEBUG("FETCH %d len %d", x, eventDataLength[x]); - - PlatformChangeEntry(BV(x), (uint8_t *)eventData[x], eventDataLength[x]); - if (eventData[x] != NULL) { - free(eventData[x]); - eventData[x] = NULL; - eventDataLength[x] = 0; - } - events &= events - 1; + if (evp != NULL) { + PlatformChangeEntry(evp->id, (uint8_t *)evp->data, evp->length); } + + RemoveEvent(); } } -- Gitblit v1.8.0