+int plugin_dispatch_values_async (const value_list_t *vl)
+{
+ dispatch_queue_t *qi;
+ int i;
+
+ if (vl == NULL)
+ return (-EINVAL);
+
+ if (dispatch_threads_num < 1)
+ {
+ ERROR ("plugin_dispatch_values_async: "
+ "No dispatch threads have been started!");
+#ifdef ENOTCONN
+ return (-ENOTCONN);
+#else
+ return (-1);
+#endif
+ }
+
+ qi = (dispatch_queue_t *) malloc (sizeof (*qi));
+ if (qi == NULL)
+ {
+ ERROR ("plugin_dispatch_values_async: malloc failed.");
+ return (-ENOMEM);
+ }
+ memset (qi, 0, sizeof (*qi));
+ qi->next = NULL;
+
+ qi->vl = (value_list_t *) malloc (sizeof (value_list_t));
+ if (qi->vl == NULL)
+ {
+ ERROR ("plugin_dispatch_values_async: malloc failed.");
+ sfree (qi);
+ return (-ENOMEM);
+ }
+ memcpy (qi->vl, vl, sizeof (value_list_t));
+ qi->vl->values = NULL;
+
+ qi->vl->values = (value_t *) calloc (qi->vl->values_len,
+ sizeof (value_t));
+ if (qi->vl->values == NULL)
+ {
+ ERROR ("plugin_dispatch_values_async: malloc failed.");
+ sfree (qi->vl);
+ sfree (qi);
+ return (-ENOMEM);
+ }
+
+ for (i = 0; i < vl->values_len; i++)
+ qi->vl->values[i] = vl->values[i];
+
+ pthread_mutex_lock (&dispatch_lock);
+
+ if (dispatch_tail == NULL)
+ {
+ dispatch_head = qi;
+ dispatch_tail = qi;
+ }
+ else
+ {
+ dispatch_tail->next = qi;
+ dispatch_tail = qi;
+ }
+
+ pthread_cond_signal (&dispatch_cond);
+ pthread_mutex_unlock (&dispatch_lock);
+
+ return (0);
+} /* int plugin_dispatch_values_async */
+