Index: apps/tagcache.c =================================================================== --- apps/tagcache.c (revision 16277) +++ apps/tagcache.c (working copy) @@ -57,6 +57,7 @@ #include #include #include "config.h" +#include "ata_idle_notify.h" #include "thread.h" #include "kernel.h" #include "system.h" @@ -3030,26 +3031,16 @@ return (next == command_queue_ridx); } - -void run_command_queue(bool force) +bool command_queue_sync_callback(void) { + struct master_header myhdr; int masterfd; - - if (COMMAND_QUEUE_IS_EMPTY) - return; - - if (!force && !command_queue_is_full() - && current_tick - TAGCACHE_COMMAND_QUEUE_COMMIT_DELAY - < command_queue_timestamp) - { - return; - } mutex_lock(&command_queue_mutex); if ( (masterfd = open_master_fd(&myhdr, true)) < 0) - return; + return false; while (command_queue_ridx != command_queue_widx) { @@ -3064,7 +3055,7 @@ /* Re-open the masterfd. */ if ( (masterfd = open_master_fd(&myhdr, true)) < 0) - return; + return true; break; } @@ -3082,8 +3073,20 @@ close(masterfd); mutex_unlock(&command_queue_mutex); + return true; } +void run_command_queue(bool force) +{ + if (COMMAND_QUEUE_IS_EMPTY) + return; + + if (force || command_queue_is_full()) + command_queue_sync_callback(); + else + register_ata_idle_func(command_queue_sync_callback); +} + static void queue_command(int cmd, long idx_id, int tag, long data) { while (1)