]> git.saurik.com Git - redis.git/blobdiff - src/bio.c
Merge remote-tracking branch 'origin/unstable' into unstable
[redis.git] / src / bio.c
index 145a2324f30333052ebe02d9217ca31c7b9e5c53..eaac8e40d55663caf3fbacf4212a01247ba26972 100644 (file)
--- a/src/bio.c
+++ b/src/bio.c
  * Every thread wait for new jobs in its queue, and process every job
  * sequentially.
  *
+ * Jobs of the same type are guaranteed to be processed from the least
+ * recently inserted to the most recently inserted (older jobs processed
+ * first).
+ *
  * Currently there is no way for the creator of the job to be notified about
  * the completion of the operation, this will only be added when/if needed.
  */
@@ -118,7 +122,6 @@ void *bioProcessBackgroundJobs(void *arg) {
         /* Pop the job from the queue. */
         ln = listFirst(bio_jobs[type]);
         job = ln->value;
-        listDelNode(bio_jobs[type],ln);
         /* It is now possible to unlock the background system as we know have
          * a stand alone job structure to process.*/
         pthread_mutex_unlock(&bio_mutex[type]);
@@ -126,6 +129,8 @@ void *bioProcessBackgroundJobs(void *arg) {
         /* Process the job accordingly to its type. */
         if (type == REDIS_BIO_CLOSE_FILE) {
             close((long)job->arg1);
+        } else if (type == REDIS_BIO_AOF_FSYNC) {
+            aof_fsync((long)job->arg1);
         } else {
             redisPanic("Wrong job type in bioProcessBackgroundJobs().");
         }
@@ -134,6 +139,7 @@ void *bioProcessBackgroundJobs(void *arg) {
         /* Lock again before reiterating the loop, if there are no longer
          * jobs to process we'll block again in pthread_cond_wait(). */
         pthread_mutex_lock(&bio_mutex[type]);
+        listDelNode(bio_jobs[type],ln);
         bio_pending[type]--;
     }
 }
@@ -147,6 +153,11 @@ unsigned long long bioPendingJobsOfType(int type) {
     return val;
 }
 
+#if 0 /* We don't use the following code for now, and bioWaitPendingJobsLE
+         probably needs a rewrite using conditional variables instead of the
+         current implementation. */
+         
+
 /* Wait until the number of pending jobs of the specified type are
  * less or equal to the specified number.
  *
@@ -184,9 +195,14 @@ time_t bioOlderJobOfType(int type) {
 
     pthread_mutex_lock(&bio_mutex[type]);
     ln = listFirst(bio_jobs[type]);
+    if (ln == NULL) {
+        pthread_mutex_unlock(&bio_mutex[type]);
+        return 0;
+    }
     job = ln->value;
     time = job->time;
     pthread_mutex_unlock(&bio_mutex[type]);
     return time;
 }
 
+#endif