Lines Matching refs:it
18 static void item_link_q(item *it);
19 static void item_unlink_q(item *it);
106 int item_is_flushed(item *it) { in item_is_flushed() argument
108 uint64_t cas = ITEM_get_cas(it); in item_is_flushed()
112 if ((it->time <= oldest_live) in item_is_flushed()
131 # define DEBUG_REFCNT(it,op) \
133 it, op, it->refcount, \
134 (it->it_flags & ITEM_LINKED) ? 'L' : ' ', \
135 (it->it_flags & ITEM_SLABBED) ? 'S' : ' ')
137 # define DEBUG_REFCNT(it,op) while(0) argument
163 item *it = NULL; in do_item_alloc() local
194 it = slabs_alloc(ntotal, id, &total_bytes, 0); in do_item_alloc()
199 if (it == NULL) { in do_item_alloc()
220 if (it == NULL) { in do_item_alloc()
227 assert(it->slabs_clsid == 0); in do_item_alloc()
231 it->next = it->prev = 0; in do_item_alloc()
246 it->slabs_clsid = id; in do_item_alloc()
248 DEBUG_REFCNT(it, '*'); in do_item_alloc()
249 it->it_flags |= settings.use_cas ? ITEM_CAS : 0; in do_item_alloc()
250 it->nkey = nkey; in do_item_alloc()
251 it->nbytes = nbytes; in do_item_alloc()
252 memcpy(ITEM_key(it), key, nkey); in do_item_alloc()
253 it->exptime = exptime; in do_item_alloc()
254 memcpy(ITEM_suffix(it), suffix, (size_t)nsuffix); in do_item_alloc()
255 it->nsuffix = nsuffix; in do_item_alloc()
258 if (it->it_flags & ITEM_CHUNKED) { in do_item_alloc()
259 item_chunk *chunk = (item_chunk *) ITEM_data(it); in do_item_alloc()
261 chunk->next = (item_chunk *) it->h_next; in do_item_alloc()
263 chunk->head = it; in do_item_alloc()
266 chunk->size = chunk->next->size - ((char *)chunk - (char *)it); in do_item_alloc()
270 it->h_next = 0; in do_item_alloc()
272 return it; in do_item_alloc()
275 void item_free(item *it) { in item_free() argument
276 size_t ntotal = ITEM_ntotal(it); in item_free()
278 assert((it->it_flags & ITEM_LINKED) == 0); in item_free()
279 assert(it != heads[it->slabs_clsid]); in item_free()
280 assert(it != tails[it->slabs_clsid]); in item_free()
281 assert(it->refcount == 0); in item_free()
284 clsid = ITEM_clsid(it); in item_free()
285 DEBUG_REFCNT(it, 'F'); in item_free()
286 slabs_free(it, ntotal, clsid); in item_free()
306 static void do_item_link_q(item *it) { /* item is the new head */ in do_item_link_q() argument
308 assert((it->it_flags & ITEM_SLABBED) == 0); in do_item_link_q()
310 head = &heads[it->slabs_clsid]; in do_item_link_q()
311 tail = &tails[it->slabs_clsid]; in do_item_link_q()
312 assert(it != *head); in do_item_link_q()
314 it->prev = 0; in do_item_link_q()
315 it->next = *head; in do_item_link_q()
316 if (it->next) it->next->prev = it; in do_item_link_q()
317 *head = it; in do_item_link_q()
318 if (*tail == 0) *tail = it; in do_item_link_q()
319 sizes[it->slabs_clsid]++; in do_item_link_q()
320 sizes_bytes[it->slabs_clsid] += it->nbytes; in do_item_link_q()
324 static void item_link_q(item *it) { in item_link_q() argument
325 pthread_mutex_lock(&lru_locks[it->slabs_clsid]); in item_link_q()
326 do_item_link_q(it); in item_link_q()
327 pthread_mutex_unlock(&lru_locks[it->slabs_clsid]); in item_link_q()
330 static void do_item_unlink_q(item *it) { in do_item_unlink_q() argument
332 head = &heads[it->slabs_clsid]; in do_item_unlink_q()
333 tail = &tails[it->slabs_clsid]; in do_item_unlink_q()
335 if (*head == it) { in do_item_unlink_q()
336 assert(it->prev == 0); in do_item_unlink_q()
337 *head = it->next; in do_item_unlink_q()
339 if (*tail == it) { in do_item_unlink_q()
340 assert(it->next == 0); in do_item_unlink_q()
341 *tail = it->prev; in do_item_unlink_q()
343 assert(it->next != it); in do_item_unlink_q()
344 assert(it->prev != it); in do_item_unlink_q()
346 if (it->next) it->next->prev = it->prev; in do_item_unlink_q()
347 if (it->prev) it->prev->next = it->next; in do_item_unlink_q()
348 sizes[it->slabs_clsid]--; in do_item_unlink_q()
349 sizes_bytes[it->slabs_clsid] -= it->nbytes; in do_item_unlink_q()
353 static void item_unlink_q(item *it) { in item_unlink_q() argument
354 pthread_mutex_lock(&lru_locks[it->slabs_clsid]); in item_unlink_q()
355 do_item_unlink_q(it); in item_unlink_q()
356 pthread_mutex_unlock(&lru_locks[it->slabs_clsid]); in item_unlink_q()
359 int do_item_link(item *it, const uint32_t hv) { in do_item_link() argument
360 MEMCACHED_ITEM_LINK(ITEM_key(it), it->nkey, it->nbytes); in do_item_link()
361 assert((it->it_flags & (ITEM_LINKED|ITEM_SLABBED)) == 0); in do_item_link()
362 it->it_flags |= ITEM_LINKED; in do_item_link()
363 it->time = current_time; in do_item_link()
366 stats_state.curr_bytes += ITEM_ntotal(it); in do_item_link()
372 ITEM_set_cas(it, (settings.use_cas) ? get_cas_id() : 0); in do_item_link()
373 assoc_insert(it, hv); in do_item_link()
374 item_link_q(it); in do_item_link()
375 refcount_incr(&it->refcount); in do_item_link()
376 item_stats_sizes_add(it); in do_item_link()
381 void do_item_unlink(item *it, const uint32_t hv) { in do_item_unlink() argument
382 MEMCACHED_ITEM_UNLINK(ITEM_key(it), it->nkey, it->nbytes); in do_item_unlink()
383 if ((it->it_flags & ITEM_LINKED) != 0) { in do_item_unlink()
384 it->it_flags &= ~ITEM_LINKED; in do_item_unlink()
386 stats_state.curr_bytes -= ITEM_ntotal(it); in do_item_unlink()
389 item_stats_sizes_remove(it); in do_item_unlink()
390 assoc_delete(ITEM_key(it), it->nkey, hv); in do_item_unlink()
391 item_unlink_q(it); in do_item_unlink()
392 do_item_remove(it); in do_item_unlink()
397 void do_item_unlink_nolock(item *it, const uint32_t hv) { in do_item_unlink_nolock() argument
398 MEMCACHED_ITEM_UNLINK(ITEM_key(it), it->nkey, it->nbytes); in do_item_unlink_nolock()
399 if ((it->it_flags & ITEM_LINKED) != 0) { in do_item_unlink_nolock()
400 it->it_flags &= ~ITEM_LINKED; in do_item_unlink_nolock()
402 stats_state.curr_bytes -= ITEM_ntotal(it); in do_item_unlink_nolock()
405 item_stats_sizes_remove(it); in do_item_unlink_nolock()
406 assoc_delete(ITEM_key(it), it->nkey, hv); in do_item_unlink_nolock()
407 do_item_unlink_q(it); in do_item_unlink_nolock()
408 do_item_remove(it); in do_item_unlink_nolock()
412 void do_item_remove(item *it) { in do_item_remove() argument
413 MEMCACHED_ITEM_REMOVE(ITEM_key(it), it->nkey, it->nbytes); in do_item_remove()
414 assert((it->it_flags & ITEM_SLABBED) == 0); in do_item_remove()
415 assert(it->refcount > 0); in do_item_remove()
417 if (refcount_decr(&it->refcount) == 0) { in do_item_remove()
418 item_free(it); in do_item_remove()
424 void do_item_update_nolock(item *it) { in do_item_update_nolock() argument
425 MEMCACHED_ITEM_UPDATE(ITEM_key(it), it->nkey, it->nbytes); in do_item_update_nolock()
426 if (it->time < current_time - ITEM_UPDATE_INTERVAL) { in do_item_update_nolock()
427 assert((it->it_flags & ITEM_SLABBED) == 0); in do_item_update_nolock()
429 if ((it->it_flags & ITEM_LINKED) != 0) { in do_item_update_nolock()
430 do_item_unlink_q(it); in do_item_update_nolock()
431 it->time = current_time; in do_item_update_nolock()
432 do_item_link_q(it); in do_item_update_nolock()
438 void do_item_update(item *it) { in do_item_update() argument
439 MEMCACHED_ITEM_UPDATE(ITEM_key(it), it->nkey, it->nbytes); in do_item_update()
440 if (it->time < current_time - ITEM_UPDATE_INTERVAL) { in do_item_update()
441 assert((it->it_flags & ITEM_SLABBED) == 0); in do_item_update()
443 if ((it->it_flags & ITEM_LINKED) != 0) { in do_item_update()
444 it->time = current_time; in do_item_update()
446 item_unlink_q(it); in do_item_update()
447 item_link_q(it); in do_item_update()
453 int do_item_replace(item *it, item *new_it, const uint32_t hv) { in do_item_replace() argument
454 MEMCACHED_ITEM_REPLACE(ITEM_key(it), it->nkey, it->nbytes, in do_item_replace()
456 assert((it->it_flags & ITEM_SLABBED) == 0); in do_item_replace()
458 do_item_unlink(it, hv); in do_item_replace()
474 item *it; in item_cachedump() local
484 it = heads[id]; in item_cachedump()
492 while (it != NULL && (limit == 0 || shown < limit)) { in item_cachedump()
493 assert(it->nkey <= KEY_MAX_LENGTH); in item_cachedump()
494 if (it->nbytes == 0 && it->nkey == 0) { in item_cachedump()
495 it = it->next; in item_cachedump()
499 strncpy(key_temp, ITEM_key(it), it->nkey); in item_cachedump()
500 key_temp[it->nkey] = 0x00; /* terminate */ in item_cachedump()
502 key_temp, it->nbytes - 2, in item_cachedump()
503 it->exptime == 0 ? 0 : in item_cachedump()
504 (unsigned long)it->exptime + process_started); in item_cachedump()
510 it = it->next; in item_cachedump()
704 void item_stats_sizes_add(item *it) { in item_stats_sizes_add() argument
705 if (stats_sizes_hist == NULL || stats_sizes_cas_min > ITEM_get_cas(it)) in item_stats_sizes_add()
707 int ntotal = ITEM_ntotal(it); in item_stats_sizes_add()
716 void item_stats_sizes_remove(item *it) { in item_stats_sizes_remove() argument
717 if (stats_sizes_hist == NULL || stats_sizes_cas_min > ITEM_get_cas(it)) in item_stats_sizes_remove()
719 int ntotal = ITEM_ntotal(it); in item_stats_sizes_remove()
753 item *it = assoc_find(key, nkey, hv); in do_item_get() local
754 if (it != NULL) { in do_item_get()
755 refcount_incr(&it->refcount); in do_item_get()
781 if (it == NULL) { in do_item_get()
791 if (it != NULL) { in do_item_get()
793 if (item_is_flushed(it)) { in do_item_get()
794 do_item_unlink(it, hv); in do_item_get()
795 do_item_remove(it); in do_item_get()
796 it = NULL; in do_item_get()
804 } else if (it->exptime != 0 && it->exptime <= current_time) { in do_item_get()
805 do_item_unlink(it, hv); in do_item_get()
806 do_item_remove(it); in do_item_get()
807 it = NULL; in do_item_get()
816 it->it_flags |= ITEM_FETCHED|ITEM_ACTIVE; in do_item_get()
817 DEBUG_REFCNT(it, '+'); in do_item_get()
826 return it; in do_item_get()
831 item *it = do_item_get(key, nkey, hv, c); in do_item_touch() local
832 if (it != NULL) { in do_item_touch()
833 it->exptime = exptime; in do_item_touch()
835 return it; in do_item_touch()
844 item *it = NULL; in lru_pull_tail() local
923 it = search; in lru_pull_tail()
935 it = search; in lru_pull_tail()
939 it = search; /* No matter what, we're stopping */ in lru_pull_tail()
968 if (it != NULL) in lru_pull_tail()
974 if (it != NULL) { in lru_pull_tail()
976 it->slabs_clsid = ITEM_clsid(it); in lru_pull_tail()
977 it->slabs_clsid |= move_to_lru; in lru_pull_tail()
978 item_link_q(it); in lru_pull_tail()
980 do_item_remove(it); in lru_pull_tail()
1197 static void crawler_link_q(item *it) { /* item is the new tail */ in crawler_link_q() argument
1199 assert(it->it_flags == 1); in crawler_link_q()
1200 assert(it->nbytes == 0); in crawler_link_q()
1202 head = &heads[it->slabs_clsid]; in crawler_link_q()
1203 tail = &tails[it->slabs_clsid]; in crawler_link_q()
1205 assert(it != *tail); in crawler_link_q()
1207 it->prev = *tail; in crawler_link_q()
1208 it->next = 0; in crawler_link_q()
1209 if (it->prev) { in crawler_link_q()
1210 assert(it->prev->next == 0); in crawler_link_q()
1211 it->prev->next = it; in crawler_link_q()
1213 *tail = it; in crawler_link_q()
1214 if (*head == 0) *head = it; in crawler_link_q()
1218 static void crawler_unlink_q(item *it) { in crawler_unlink_q() argument
1220 head = &heads[it->slabs_clsid]; in crawler_unlink_q()
1221 tail = &tails[it->slabs_clsid]; in crawler_unlink_q()
1223 if (*head == it) { in crawler_unlink_q()
1224 assert(it->prev == 0); in crawler_unlink_q()
1225 *head = it->next; in crawler_unlink_q()
1227 if (*tail == it) { in crawler_unlink_q()
1228 assert(it->next == 0); in crawler_unlink_q()
1229 *tail = it->prev; in crawler_unlink_q()
1231 assert(it->next != it); in crawler_unlink_q()
1232 assert(it->prev != it); in crawler_unlink_q()
1234 if (it->next) it->next->prev = it->prev; in crawler_unlink_q()
1235 if (it->prev) it->prev->next = it->next; in crawler_unlink_q()
1241 static item *crawler_crawl_q(item *it) { in crawler_crawl_q() argument
1243 assert(it->it_flags == 1); in crawler_crawl_q()
1244 assert(it->nbytes == 0); in crawler_crawl_q()
1245 head = &heads[it->slabs_clsid]; in crawler_crawl_q()
1246 tail = &tails[it->slabs_clsid]; in crawler_crawl_q()
1249 if (it->prev == 0) { in crawler_crawl_q()
1250 assert(*head == it); in crawler_crawl_q()
1251 if (it->next) { in crawler_crawl_q()
1252 *head = it->next; in crawler_crawl_q()
1253 assert(it->next->prev == it); in crawler_crawl_q()
1254 it->next->prev = 0; in crawler_crawl_q()
1261 assert(it->prev != it); in crawler_crawl_q()
1262 if (it->prev) { in crawler_crawl_q()
1263 if (*head == it->prev) { in crawler_crawl_q()
1265 *head = it; in crawler_crawl_q()
1267 if (*tail == it) { in crawler_crawl_q()
1269 *tail = it->prev; in crawler_crawl_q()
1271 assert(it->next != it); in crawler_crawl_q()
1272 if (it->next) { in crawler_crawl_q()
1273 assert(it->prev->next == it); in crawler_crawl_q()
1274 it->prev->next = it->next; in crawler_crawl_q()
1275 it->next->prev = it->prev; in crawler_crawl_q()
1278 it->prev->next = 0; in crawler_crawl_q()
1281 it->next = it->prev; in crawler_crawl_q()
1282 it->prev = it->next->prev; in crawler_crawl_q()
1283 it->next->prev = it; in crawler_crawl_q()
1285 if (it->prev) { in crawler_crawl_q()
1286 it->prev->next = it; in crawler_crawl_q()
1289 assert(it->next != it); in crawler_crawl_q()
1290 assert(it->prev != it); in crawler_crawl_q()
1292 return it->next; /* success */ in crawler_crawl_q()