From 7572cd33f27b512691b6acf39cd0d78d35017a46 Mon Sep 17 00:00:00 2001 From: pans <pans@454eff88-639b-444f-9e54-f578c98de674> Date: 星期五, 18 八月 2017 13:34:18 +0800 Subject: [PATCH] capnp fix bug --- VisitFace/RtspNativeCodec/app/src/main/cpp/looper.cpp | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 152 insertions(+), 0 deletions(-) diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/looper.cpp b/VisitFace/RtspNativeCodec/app/src/main/cpp/looper.cpp new file mode 100644 index 0000000..02c543c --- /dev/null +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/looper.cpp @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "looper.h" + +#include <assert.h> +#include <jni.h> +#include <pthread.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include <limits.h> +#include <semaphore.h> + +// for __android_log_print(ANDROID_LOG_INFO, "YourApp", "formatted message"); +#include <android/log.h> +#define TAG "NativeCodec-looper" +#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__) + + +struct loopermessage; +typedef struct loopermessage loopermessage; + +struct loopermessage { + int what; + void *obj; + loopermessage *next; + bool quit; +}; + + + +void* looper::trampoline(void* p) { + ((looper*)p)->loop(); + return NULL; +} + +looper::looper() { + sem_init(&headdataavailable, 0, 0); + sem_init(&headwriteprotect, 0, 1); + pthread_attr_t attr; + pthread_attr_init(&attr); + + pthread_create(&worker, &attr, trampoline, this); + running = true; +} + + +looper::~looper() { + if (running) { + LOGV("Looper deleted while still running. Some messages will not be processed"); + quit(); + } +} + +void looper::post(int what, void *data, bool flush) { + loopermessage *msg = new loopermessage(); + msg->what = what; + msg->obj = data; + msg->next = NULL; + msg->quit = false; + addmsg(msg, flush); +} + +void looper::addmsg(loopermessage *msg, bool flush) { + sem_wait(&headwriteprotect); + loopermessage *h = head; + + if (flush) { + while(h) { + loopermessage *next = h->next; + delete h; + h = next; + } + h = NULL; + } + if (h) { + while (h->next) { + h = h->next; + } + h->next = msg; + } else { + head = msg; + } + //LOGV("post msg %d", msg->what); + sem_post(&headwriteprotect); + sem_post(&headdataavailable); +} + +void looper::loop() { + while(true) { + // wait for available message + sem_wait(&headdataavailable); + + // get next available message + sem_wait(&headwriteprotect); + loopermessage *msg = head; + if (msg == NULL) { + LOGV("no msg"); + sem_post(&headwriteprotect); + continue; + } + head = msg->next; + sem_post(&headwriteprotect); + + if (msg->quit) { + LOGV("quitting"); + delete msg; + return; + } + //LOGV("processing msg %d", msg->what); + handle(msg->what, msg->obj); + delete msg; + } +} + +void looper::quit() { + LOGV("quit"); + loopermessage *msg = new loopermessage(); + msg->what = 0; + msg->obj = NULL; + msg->next = NULL; + msg->quit = true; + addmsg(msg, false); + void *retval; + pthread_join(worker, &retval); + sem_destroy(&headdataavailable); + sem_destroy(&headwriteprotect); + running = false; +} + +void looper::handle(int what, void* obj) { + LOGV("dropping msg %d %p", what, obj); +} + -- Gitblit v1.8.0