]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Lock under-construction task, taskmgr objects to satisfy Coverity's
authorDave Hart <hart@ntp.org>
Mon, 7 Mar 2011 10:19:45 +0000 (10:19 +0000)
committerDave Hart <hart@ntp.org>
Mon, 7 Mar 2011 10:19:45 +0000 (10:19 +0000)
  mostly-correct assumptions about which variables are protected by
  which locks.

bk: 4d74b141yLbyC8XHcSlkIGgvXXD1dQ

ChangeLog
lib/isc/task.c

index 88b19f462d223f1082c3ddcbddfd72f4ec1cb40d..d37bfa8bf90a326da2a106e3886e4b444e678c08 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,9 @@
   use the "debug" variable regardless of #ifdef DEBUG.
 * Declare debug in libntp instead of each program.  Expose extern
   declaration to utilities, libntp, and DEBUG ntpd.
+* Lock under-construction task, taskmgr objects to satisfy Coverity's
+  mostly-correct assumptions about which variables are protected by
+  which locks.
 (4.2.7p136) 2011/03/02 Released by Harlan Stenn <stenn@ntp.org>
 * [Bug 1839] 4.2.7p135 still installs libevent ev*.h headers.
 (4.2.7p135) 2011/03/02 Released by Harlan Stenn <stenn@ntp.org>
index a630173d940556dabd3ae01472de8d5fc66e4ae0..47f978371d52e23e44089004f2c9109428c21b2a 100644 (file)
@@ -186,12 +186,13 @@ isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
        if (task == NULL)
                return (ISC_R_NOMEMORY);
        XTRACE("isc_task_create");
-       task->manager = manager;
        result = isc_mutex_init(&task->lock);
        if (result != ISC_R_SUCCESS) {
                isc_mem_put(manager->mctx, task, sizeof(*task));
                return (result);
        }
+       LOCK(&task->lock);      /* helps coverity analysis noise ratio */
+       task->manager = manager;
        task->state = task_state_idle;
        task->references = 1;
        INIT_LIST(task->events);
@@ -203,6 +204,7 @@ isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
        task->tag = NULL;
        INIT_LINK(task, link);
        INIT_LINK(task, ready_link);
+       UNLOCK(&task->lock);
 
        exiting = ISC_FALSE;
        LOCK(&manager->lock);
@@ -1057,11 +1059,12 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
        manager = isc_mem_get(mctx, sizeof(*manager));
        if (manager == NULL)
                return (ISC_R_NOMEMORY);
-       manager->magic = TASK_MANAGER_MAGIC;
-       manager->mctx = NULL;
        result = isc_mutex_init(&manager->lock);
        if (result != ISC_R_SUCCESS)
                goto cleanup_mgr;
+       LOCK(&manager->lock);
+       manager->magic = TASK_MANAGER_MAGIC;
+       manager->mctx = NULL;
 
 #ifdef ISC_PLATFORM_USETHREADS
        manager->workers = 0;
@@ -1100,7 +1103,6 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
        isc_mem_attach(mctx, &manager->mctx);
 
 #ifdef ISC_PLATFORM_USETHREADS
-       LOCK(&manager->lock);
        /*
         * Start workers.
         */
@@ -1121,6 +1123,7 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
        isc_thread_setconcurrency(workers);
 #else /* ISC_PLATFORM_USETHREADS */
        manager->refs = 1;
+       UNLOCK(&manager->lock);
        taskmgr = manager;
 #endif /* ISC_PLATFORM_USETHREADS */
 
@@ -1134,6 +1137,7 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
  cleanup_threads:
        isc_mem_free(mctx, manager->threads);
  cleanup_lock:
+       UNLOCK(&manager->lock);
        DESTROYLOCK(&manager->lock);
 #endif
  cleanup_mgr: