Author: abroekhuis
Date: Wed Dec 10 09:49:37 2014
New Revision: 1644359

URL: http://svn.apache.org/r1644359
Log:
CELIX-119: Updates to logservice.

Modified:
    celix/trunk/log_service/private/src/log.c
    celix/trunk/utils/private/src/celix_threads.c
    celix/trunk/utils/public/include/celix_threads.h

Modified: celix/trunk/log_service/private/src/log.c
URL: 
http://svn.apache.org/viewvc/celix/trunk/log_service/private/src/log.c?rev=1644359&r1=1644358&r2=1644359&view=diff
==============================================================================
--- celix/trunk/log_service/private/src/log.c (original)
+++ celix/trunk/log_service/private/src/log.c Wed Dec 10 09:49:37 2014
@@ -90,6 +90,7 @@ celix_status_t log_destroy(log_pt logger
 
        celixThreadMutex_destroy(&logger->listenerLock);
        celixThreadMutex_destroy(&logger->deliverLock);
+       celixThreadCondition_destroy(&logger->entriesToDeliver);
 
        arrayList_destroy(logger->listenerEntries);
        arrayList_destroy(logger->listeners);
@@ -196,22 +197,25 @@ celix_status_t log_frameworkEvent(void *
 celix_status_t log_addLogListener(log_pt logger, log_listener_pt listener) {
        celix_status_t status = CELIX_SUCCESS;
 
-       celixThreadMutex_lock(&logger->listenerLock);
+       status = celixThreadMutex_lock(&logger->listenerLock);
 
-       arrayList_add(logger->listeners, listener);
-       log_startListenerThread(logger);
+       if (status == CELIX_SUCCESS) {
+               arrayList_add(logger->listeners, listener);
+               log_startListenerThread(logger);
 
-       celixThreadMutex_unlock(&logger->listenerLock);
+               status = celixThreadMutex_unlock(&logger->listenerLock);
+       }
 
        return status;
 }
 
 celix_status_t log_removeLogListener(log_pt logger, log_listener_pt listener) {
        celix_status_t status = CELIX_SUCCESS;
+    celix_status_t threadStatus = CELIX_SUCCESS;
        bool last = false;
 
-       celixThreadMutex_lock(&logger->deliverLock);
-       celixThreadMutex_lock(&logger->listenerLock);
+    status = CELIX_DO_IF(status, celixThreadMutex_lock(&logger->deliverLock));
+    status = CELIX_DO_IF(status, celixThreadMutex_lock(&logger->listenerLock));
 
        if (status == CELIX_SUCCESS) {
                arrayList_removeElement(logger->listeners, listener);
@@ -220,11 +224,11 @@ celix_status_t log_removeLogListener(log
                        last = true;
                }
 
-               celixThreadMutex_unlock(&logger->listenerLock);
-               celixThreadMutex_unlock(&logger->deliverLock);
+        status = CELIX_DO_IF(status, 
celixThreadMutex_unlock(&logger->listenerLock));
+        status = CELIX_DO_IF(status, 
celixThreadMutex_unlock(&logger->deliverLock));
 
                if (last) {
-                       celixThread_join(logger->listenerThread, NULL);
+                   status = CELIX_DO_IF(status, 
celixThread_join(logger->listenerThread, &threadStatus));
                }
 
                if (status == CELIX_SUCCESS) {
@@ -242,11 +246,13 @@ celix_status_t log_removeLogListener(log
 celix_status_t log_removeAllLogListener(log_pt logger) {
        celix_status_t status = CELIX_SUCCESS;
 
-       celixThreadMutex_lock(&logger->listenerLock);
+       status = celixThreadMutex_lock(&logger->listenerLock);
 
-       arrayList_clear(logger->listeners);
+    if (status == CELIX_SUCCESS) {
+       arrayList_clear(logger->listeners);
 
-       celixThreadMutex_unlock(&logger->listenerLock);
+       status = celixThreadMutex_unlock(&logger->listenerLock);
+    }
 
        return status;
 }
@@ -255,8 +261,8 @@ static celix_status_t log_startListenerT
        celix_status_t status = CELIX_SUCCESS;
 
        logger->running = true;
-
-       status = celixThread_create(&logger->listenerThread, NULL, 
&log_listenerThread, logger);
+    logger->running = true;
+    status = celixThread_create(&logger->listenerThread, NULL, 
log_listenerThread, logger);
 
        return status;
 }
@@ -287,21 +293,24 @@ static void * log_listenerThread(void *d
                        if (!arrayList_isEmpty(logger->listenerEntries)) {
                                log_entry_pt entry = (log_entry_pt) 
arrayList_remove(logger->listenerEntries, 0);
 
-                               status = 
celixThreadMutex_lock(&logger->listenerLock);
-                               if (status != CELIX_SUCCESS) {
-                                       logger->running = false;
-                               } else {
-                                       array_list_iterator_pt it = 
arrayListIterator_create(logger->listeners);
-                                       while (arrayListIterator_hasNext(it)) {
-                                               log_listener_pt listener = 
arrayListIterator_next(it);
-                                               listener->logged(listener, 
entry);
-                                       }
-                                       arrayListIterator_destroy(it);
-
-                                       status = 
celixThreadMutex_unlock(&logger->listenerLock);
+                               if (entry) {
+                                       status = 
celixThreadMutex_lock(&logger->listenerLock);
                                        if (status != CELIX_SUCCESS) {
                                                logger->running = false;
                                                break;
+                                       } else {
+                                               array_list_iterator_pt it = 
arrayListIterator_create(logger->listeners);
+                                               while 
(arrayListIterator_hasNext(it)) {
+                                                       log_listener_pt 
listener = arrayListIterator_next(it);
+                                                       
listener->logged(listener, entry);
+                                               }
+                                               arrayListIterator_destroy(it);
+
+                                               status = 
celixThreadMutex_unlock(&logger->listenerLock);
+                                               if (status != CELIX_SUCCESS) {
+                                                       logger->running = false;
+                                                       break;
+                                               }
                                        }
                                }
                        }
@@ -314,9 +323,12 @@ static void * log_listenerThread(void *d
 
                        if (status != CELIX_SUCCESS) {
                                logger->running = false;
+                               break;
                        }
                }
 
        }
-       return NULL;
+
+    celixThread_exit(status);
+    return NULL;
 }

Modified: celix/trunk/utils/private/src/celix_threads.c
URL: 
http://svn.apache.org/viewvc/celix/trunk/utils/private/src/celix_threads.c?rev=1644359&r1=1644358&r2=1644359&view=diff
==============================================================================
--- celix/trunk/utils/private/src/celix_threads.c (original)
+++ celix/trunk/utils/private/src/celix_threads.c Wed Dec 10 09:49:37 2014
@@ -102,6 +102,10 @@ celix_status_t celixThreadCondition_init
     return pthread_cond_init(condition, attr);
 }
 
+celix_status_t celixThreadCondition_destroy(celix_thread_cond_t *condition) {
+    return pthread_cond_destroy(condition);
+}
+
 celix_status_t celixThreadCondition_wait(celix_thread_cond_t *cond, 
celix_thread_mutex_t *mutex) {
     return pthread_cond_wait(cond, mutex);
 }

Modified: celix/trunk/utils/public/include/celix_threads.h
URL: 
http://svn.apache.org/viewvc/celix/trunk/utils/public/include/celix_threads.h?rev=1644359&r1=1644358&r2=1644359&view=diff
==============================================================================
--- celix/trunk/utils/public/include/celix_threads.h (original)
+++ celix/trunk/utils/public/include/celix_threads.h Wed Dec 10 09:49:37 2014
@@ -68,6 +68,7 @@ typedef pthread_cond_t celix_thread_cond
 typedef pthread_condattr_t celix_thread_condattr_t;
 
 celix_status_t celixThreadCondition_init(celix_thread_cond_t *condition, 
celix_thread_condattr_t *attr);
+celix_status_t celixThreadCondition_destroy(celix_thread_cond_t *condition);
 celix_status_t celixThreadCondition_wait(celix_thread_cond_t *cond, 
celix_thread_mutex_t *mutex);
 celix_status_t celixThreadCondition_broadcast(celix_thread_cond_t *cond);
 celix_status_t celixThreadCondition_signal(celix_thread_cond_t *cond);


Reply via email to