fctom1215
2020-02-03 2117dc433abc11b526b74ffb32de851f1d82dee9
重写了消息事件部分,之前的缺乏线程安全可能导致崩溃。
3个文件已修改
152 ■■■■■ 已修改文件
lib/src/main/cpp/native-lib.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/rtk_module/virtual_rtk.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/rtk_platform/platform.cpp 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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) {
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;
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();
    }
}