Lines Matching refs:p
167 static void _free_page(store_engine *e, store_page *p);
201 store_page *p = &e->pages[i]; in extstore_get_page_data() local
202 pthread_mutex_lock(&p->mutex); in extstore_get_page_data()
204 pd[p->id].free_bucket = p->free_bucket; in extstore_get_page_data()
205 pd[p->id].version = p->version; in extstore_get_page_data()
206 pd[p->id].bytes_used = p->bytes_used; in extstore_get_page_data()
207 if (p->active) { in extstore_get_page_data()
208 pd[p->id].active = true; in extstore_get_page_data()
210 if (p->active || p->free) { in extstore_get_page_data()
211 pthread_mutex_unlock(&p->mutex); in extstore_get_page_data()
214 if (p->obj_count > 0 && !p->closed) { in extstore_get_page_data()
215 pd[p->id].bucket = p->bucket; in extstore_get_page_data()
217 if ((p->obj_count == 0 || p->closed) && p->refcount == 0) { in extstore_get_page_data()
218 _free_page(e, p); in extstore_get_page_data()
220 pthread_mutex_unlock(&p->mutex); in extstore_get_page_data()
499 static void _allocate_wbuf(store_engine *e, store_page *p) { in _allocate_wbuf() argument
501 assert(!p->wbuf); in _allocate_wbuf()
510 wbuf->offset = p->allocated; in _allocate_wbuf()
511 p->allocated += wbuf->size; in _allocate_wbuf()
517 p->wbuf = wbuf; in _allocate_wbuf()
529 store_page *p = &e->pages[io->page_id]; in _wbuf_cb() local
535 pthread_mutex_lock(&p->mutex); in _wbuf_cb()
536 assert(p->wbuf != NULL && p->wbuf == w); in _wbuf_cb()
537 assert(p->written == w->offset); in _wbuf_cb()
538 p->written += w->size; in _wbuf_cb()
539 p->wbuf = NULL; in _wbuf_cb()
541 if (p->written == e->page_size) in _wbuf_cb()
542 p->active = false; in _wbuf_cb()
552 pthread_mutex_unlock(&p->mutex); in _wbuf_cb()
558 static void _submit_wbuf(store_engine *e, store_page *p) { in _submit_wbuf() argument
564 w = p->wbuf; in _submit_wbuf()
571 io->page_id = p->id; in _submit_wbuf()
593 store_page *p; in extstore_write_request() local
599 p = e->page_buckets[bucket]; in extstore_write_request()
600 if (!p) { in extstore_write_request()
601 p = _allocate_page(e, bucket, free_bucket); in extstore_write_request()
604 if (!p) { in extstore_write_request()
609 pthread_mutex_lock(&p->mutex); in extstore_write_request()
613 if (!p->active || in extstore_write_request()
614 ((!p->wbuf || p->wbuf->full) && p->allocated >= e->page_size)) { in extstore_write_request()
615 pthread_mutex_unlock(&p->mutex); in extstore_write_request()
626 if (p->wbuf && p->wbuf->free < io->len && !p->wbuf->full) { in extstore_write_request()
627 _submit_wbuf(e, p); in extstore_write_request()
628 p->wbuf->full = true; in extstore_write_request()
631 if (!p->wbuf && p->allocated < e->page_size) { in extstore_write_request()
632 _allocate_wbuf(e, p); in extstore_write_request()
637 if (p->wbuf && !p->wbuf->full && p->wbuf->free >= io->len) { in extstore_write_request()
638 io->buf = p->wbuf->buf_pos; in extstore_write_request()
639 io->page_id = p->id; in extstore_write_request()
643 pthread_mutex_unlock(&p->mutex); in extstore_write_request()
653 store_page *p = &e->pages[io->page_id]; in extstore_write() local
655 io->offset = p->wbuf->offset + (p->wbuf->size - p->wbuf->free); in extstore_write()
656 io->page_version = p->version; in extstore_write()
657 p->wbuf->buf_pos += io->len; in extstore_write()
658 p->wbuf->free -= io->len; in extstore_write()
659 p->bytes_used += io->len; in extstore_write()
660 p->obj_count++; in extstore_write()
668 pthread_mutex_unlock(&p->mutex); in extstore_write()
727 store_page *p = &e->pages[page_id]; in extstore_delete() local
730 pthread_mutex_lock(&p->mutex); in extstore_delete()
731 if (!p->closed && p->version == page_version) { in extstore_delete()
732 if (p->bytes_used >= bytes) { in extstore_delete()
733 p->bytes_used -= bytes; in extstore_delete()
735 p->bytes_used = 0; in extstore_delete()
738 if (p->obj_count >= count) { in extstore_delete()
739 p->obj_count -= count; in extstore_delete()
741 p->obj_count = 0; // caller has bad accounting? in extstore_delete()
748 if (p->obj_count == 0 && p->refcount == 0 && !p->active) { in extstore_delete()
749 _free_page(e, p); in extstore_delete()
754 pthread_mutex_unlock(&p->mutex); in extstore_delete()
760 store_page *p = &e->pages[page_id]; in extstore_check() local
763 pthread_mutex_lock(&p->mutex); in extstore_check()
764 if (p->version != page_version) in extstore_check()
766 pthread_mutex_unlock(&p->mutex); in extstore_check()
773 store_page *p = &e->pages[page_id]; in extstore_close_page() local
775 pthread_mutex_lock(&p->mutex); in extstore_close_page()
776 if (!p->closed && !p->active && p->version == page_version) { in extstore_close_page()
777 p->closed = true; in extstore_close_page()
778 if (p->refcount == 0) { in extstore_close_page()
779 _free_page(e, p); in extstore_close_page()
782 pthread_mutex_unlock(&p->mutex); in extstore_close_page()
788 store_page *p = &e->pages[page_id]; in extstore_evict_page() local
790 pthread_mutex_lock(&p->mutex); in extstore_evict_page()
791 if (!p->closed && !p->active && p->version == page_version) { in extstore_evict_page()
793 p->id, (unsigned long long) p->version); in extstore_evict_page()
795 p->closed = true; in extstore_evict_page()
798 e->stats.objects_evicted += p->obj_count; in extstore_evict_page()
799 e->stats.bytes_evicted += p->bytes_used; in extstore_evict_page()
801 if (p->refcount == 0) { in extstore_evict_page()
802 _free_page(e, p); in extstore_evict_page()
805 pthread_mutex_unlock(&p->mutex); in extstore_evict_page()
814 static inline int _read_from_wbuf(store_page *p, obj_io *io) { in _read_from_wbuf() argument
815 _store_wbuf *wbuf = p->wbuf; in _read_from_wbuf()
817 assert(io->offset < p->written + wbuf->size); in _read_from_wbuf()
878 store_page *p = &e->pages[cur_io->page_id]; in extstore_io_thread() local
883 pthread_mutex_lock(&p->mutex); in extstore_io_thread()
884 if (!p->free && !p->closed && p->version == cur_io->page_version) { in extstore_io_thread()
885 if (p->active && cur_io->offset >= p->written) { in extstore_io_thread()
886 ret = _read_from_wbuf(p, cur_io); in extstore_io_thread()
889 p->refcount++; in extstore_io_thread()
899 pthread_mutex_unlock(&p->mutex); in extstore_io_thread()
904 ret = lseek(p->fd, p->offset + cur_io->offset, SEEK_SET); in extstore_io_thread()
907 ret = read(p->fd, cur_io->buf, cur_io->len); in extstore_io_thread()
909 ret = readv(p->fd, cur_io->iov, cur_io->iovcnt); in extstore_io_thread()
914 … ret = pread(p->fd, cur_io->buf, cur_io->len, p->offset + cur_io->offset); in extstore_io_thread()
916 … ret = preadv(p->fd, cur_io->iov, cur_io->iovcnt, p->offset + cur_io->offset); in extstore_io_thread()
925 ret = pwrite(p->fd, cur_io->buf, cur_io->len, p->offset + cur_io->offset); in extstore_io_thread()
939 pthread_mutex_lock(&p->mutex); in extstore_io_thread()
940 p->refcount--; in extstore_io_thread()
941 pthread_mutex_unlock(&p->mutex); in extstore_io_thread()
951 static void _free_page(store_engine *e, store_page *p) { in _free_page() argument
954 E_DEBUG("EXTSTORE: freeing page %u\n", p->id); in _free_page()
956 e->stats.objects_used -= p->obj_count; in _free_page()
957 e->stats.bytes_used -= p->bytes_used; in _free_page()
962 tmp = e->page_buckets[p->bucket]; in _free_page()
964 if (tmp == p) { in _free_page()
968 e->page_buckets[p->bucket] = tmp->next; in _free_page()
977 p->version = 0; in _free_page()
978 p->obj_count = 0; in _free_page()
979 p->bytes_used = 0; in _free_page()
980 p->allocated = 0; in _free_page()
981 p->written = 0; in _free_page()
982 p->bucket = 0; in _free_page()
983 p->active = false; in _free_page()
984 p->closed = false; in _free_page()
985 p->free = true; in _free_page()
987 p->next = e->free_page_buckets[p->free_bucket]; in _free_page()
988 e->free_page_buckets[p->free_bucket] = p; in _free_page()