X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/c1ae36aea814e1bcb0f046a00b51ed46d7432c3b..401c3e213c89d98bbeda399b4e17fbd636b80ac0:/src/vm.c diff --git a/src/vm.c b/src/vm.c index 6c0d79b0..ac0d92e3 100644 --- a/src/vm.c +++ b/src/vm.c @@ -96,7 +96,6 @@ void vmInit(void) { server.io_processed = listCreate(); server.io_ready_clients = listCreate(); pthread_mutex_init(&server.io_mutex,NULL); - pthread_mutex_init(&server.obj_freelist_mutex,NULL); pthread_mutex_init(&server.io_swapfile_mutex,NULL); server.io_active_threads = 0; if (pipe(pipefds) == -1) { @@ -110,6 +109,11 @@ void vmInit(void) { /* LZF requires a lot of stack */ pthread_attr_init(&server.io_threads_attr); pthread_attr_getstacksize(&server.io_threads_attr, &stacksize); + + /* Solaris may report a stacksize of 0, let's set it to 1 otherwise + * multiplying it by 2 in the while loop later will not really help ;) */ + if (!stacksize) stacksize = 1; + while (stacksize < REDIS_THREAD_STACK_SIZE) stacksize *= 2; pthread_attr_setstacksize(&server.io_threads_attr, stacksize); /* Listen for events in the threaded I/O pipe */ @@ -259,7 +263,7 @@ int vmWriteObjectOnSwap(robj *o, off_t page) { * If we can't find enough contiguous empty pages to swap the object on disk * NULL is returned. */ vmpointer *vmSwapObjectBlocking(robj *val) { - off_t pages = rdbSavedObjectPages(val,NULL); + off_t pages = rdbSavedObjectPages(val); off_t page; vmpointer *vp; @@ -357,7 +361,7 @@ robj *vmPreviewObject(robj *o) { double computeObjectSwappability(robj *o) { /* actual age can be >= minage, but not < minage. As we use wrapping * 21 bit clocks with minutes resolution for the LRU. */ - time_t minage = abs(server.lruclock - o->lru); + time_t minage = estimateObjectIdleTime(o); long asize = 0, elesize; robj *ele; list *l; @@ -566,7 +570,7 @@ void vmThreadedIOCompletedJob(aeEventLoop *el, int fd, void *privdata, REDIS_NOTUSED(mask); REDIS_NOTUSED(privdata); - if (privdata == NULL) trytoswap = 0; /* check the comments above... */ + if (privdata != NULL) trytoswap = 0; /* check the comments above... */ /* For every byte we read in the read side of the pipe, there is one * I/O job completed to process. */ @@ -817,9 +821,7 @@ void *IOThreadEntryPoint(void *arg) { vmpointer *vp = (vmpointer*)j->id; j->val = vmReadObjectFromSwap(j->page,vp->vtype); } else if (j->type == REDIS_IOJOB_PREPARE_SWAP) { - FILE *fp = fopen("/dev/null","w+"); - j->pages = rdbSavedObjectPages(j->val,fp); - fclose(fp); + j->pages = rdbSavedObjectPages(j->val); } else if (j->type == REDIS_IOJOB_DO_SWAP) { if (vmWriteObjectOnSwap(j->val,j->page) == REDIS_ERR) j->canceled = 1;