=== modified file 'sites/all/modules/job_queue/job_queue.install' --- sites/all/modules/job_queue/job_queue.install 2008-01-10 05:58:11 +0000 +++ sites/all/modules/job_queue/job_queue.install 2008-01-10 05:58:54 +0000 @@ -12,6 +12,7 @@ arguments text NOT NULL, file varchar(255) NOT NULL, queue int NOT NULL DEFAULT 0, + locked int NOT NULL DEFAULT 0, PRIMARY KEY (jqid), KEY(queue) )'); @@ -53,3 +54,17 @@ return $return; } + + +function job_queue_update_3() { + $return = array(); + + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + $return[] = update_sql('ALTER TABLE {job_queue} ADD locked int NOT NULL DEFAULT 0'); + break; + } + + return $return; +} === modified file 'sites/all/modules/job_queue/job_queue.module' --- sites/all/modules/job_queue/job_queue.module 2008-01-10 05:58:11 +0000 +++ sites/all/modules/job_queue/job_queue.module 2008-01-10 05:58:54 +0000 @@ -53,15 +53,24 @@ /** * Dequeue and execute a queued job. Actions are logged via watchdog(). * + * @param $queue Optional numeric queue identifer. + * @param $locked Optional numeric lock identifer, used to identify dequeue caller. + * * @return TRUE if a job was dequeued, reguardless of success or failure * executing. FALSE if the queue was empty. */ -function job_queue_dequeue($queue = 0) { - $result = db_query_range('SELECT jqid, description, function, arguments, file FROM {job_queue} WHERE queue = %d ORDER BY jqid', $queue, 0, 1); +function job_queue_dequeue($queue = 0, $locked = 1) { + // Prevent multiple callers from getting the same job. + db_lock_table('job_queue'); + $result = db_query_range('SELECT jqid, description, function, arguments, file FROM {job_queue} WHERE queue = %d AND locked = 0 ORDER BY jqid', $queue, 0, 1); if (db_num_rows($result) == 0) { + db_unlock_tables(); return FALSE; } $job = db_fetch_object($result); + // Mark the job as locked and releaste the table lock. + db_query('UPDATE {job_queue} SET locked = %d WHERE jqid = %d', $locked, $job->jqid); + db_unlock_tables(); if (!empty($job->file)) { include_once $job->file; }