+}
+
+eNextState NextDBOperation(AsyncIO *IO, IO_CallBack CB)
+{
+ IO->NextDBOperation = CB;
+ ev_idle_init(&IO->db_unwind_stack,
+ DB_PerformNext);
+ IO->db_unwind_stack.data = IO;
+ ev_idle_start(event_db, &IO->db_unwind_stack);
+ return eDBQuery;
+}
+
+/*------------------------------------------------------------------------------
+ * Client IO
+ *----------------------------------------------------------------------------*/
+extern int evbase_count;
+extern pthread_mutex_t EventQueueMutex;
+extern HashList *InboundEventQueue;
+extern struct ev_loop *event_base;
+extern ev_async AddJob;
+extern ev_async ExitEventLoop;
+
+static void IO_abort_shutdown_callback(struct ev_loop *loop,
+ ev_cleanup *watcher,
+ int revents)
+{
+ AsyncIO *IO = watcher->data;
+ EV_syslog(LOG_DEBUG, "EVENT Q: %s\n", __FUNCTION__);
+ IO->Now = ev_now(event_base);
+ assert(IO->ShutdownAbort);
+ IO->ShutdownAbort(IO);
+}
+
+
+eNextState QueueEventContext(AsyncIO *IO, IO_CallBack CB)
+{
+ IOAddHandler *h;
+ int i;
+
+ h = (IOAddHandler*)malloc(sizeof(IOAddHandler));
+ h->IO = IO;
+ h->EvAttch = CB;
+ ev_cleanup_init(&IO->abort_by_shutdown,
+ IO_abort_shutdown_callback);
+ IO->abort_by_shutdown.data = IO;
+ ev_cleanup_start(event_base, &IO->abort_by_shutdown);
+
+ pthread_mutex_lock(&EventQueueMutex);
+ EVM_syslog(LOG_DEBUG, "EVENT Q\n");
+ i = ++evbase_count;