/* create MIME Header for Gopher Data */ static void gopherMimeCreate(GopherStateData * gopherState) { StoreEntry *e = gopherState->entry; HttpReply *reply = e->mem_obj->reply; http_version_t version; const char *mime_type = NULL; const char *mime_enc = NULL; switch (gopherState->type_id) { case GOPHER_DIRECTORY: case GOPHER_INDEX: case GOPHER_HTML: case GOPHER_WWW: case GOPHER_CSO: mime_type = "text/html"; break; case GOPHER_GIF: case GOPHER_IMAGE: case GOPHER_PLUS_IMAGE: mime_type = "image/gif"; break; case GOPHER_SOUND: case GOPHER_PLUS_SOUND: mime_type = "audio/basic"; break; case GOPHER_PLUS_MOVIE: mime_type = "video/mpeg"; break; case GOPHER_MACBINHEX: mime_type = "application/macbinary"; break; case GOPHER_DOSBIN: case GOPHER_UUENCODED: case GOPHER_BIN: case GOPHER_FILE: default: /* Rightnow We have no idea what it is. */ mime_type = mimeGetContentType(gopherState->request); mime_enc = mimeGetContentEncoding(gopherState->request); break; } storeBuffer(e); httpReplyReset(reply); EBIT_CLR(gopherState->entry->flags, ENTRY_FWD_HDR_WAIT); httpBuildVersion(&version, 1, 0); httpReplySetHeaders(reply, version, HTTP_OK, "Gatewaying", mime_type, -1, -1, -1); if (mime_enc) httpHeaderPutStr(&reply->header, HDR_CONTENT_ENCODING, mime_enc); httpReplySwapOut(reply, e); reply->hdr_sz = e->mem_obj->inmem_hi; storeTimestampsSet(e); if (EBIT_TEST(e->flags, ENTRY_CACHABLE)) { storeSetPublicKey(e); } else { storeRelease(e); } }
static void storeCleanup(void *datanotused) { static int bucketnum = -1; static int validnum = 0; static int store_errors = 0; int validnum_start; StoreEntry *e; hash_link *link_ptr = NULL; hash_link *link_next = NULL; int limit = opt_foreground_rebuild ? 1 << 30 : 500; validnum_start = validnum; while (validnum - validnum_start < limit) { if (++bucketnum >= store_hash_buckets) { debug(20, 1) (" Completed Validation Procedure\n"); debug(20, 1) (" Validated %d Entries\n", validnum); debug(20, 1) (" store_swap_size = %dk\n", store_swap_size); store_dirs_rebuilding--; assert(0 == store_dirs_rebuilding); if (opt_store_doublecheck) assert(store_errors == 0); if (store_digest) storeDigestNoteStoreReady(); return; } link_next = hash_get_bucket(store_table, bucketnum); while (NULL != (link_ptr = link_next)) { link_next = link_ptr->next; e = (StoreEntry *) link_ptr; if (EBIT_TEST(e->flags, ENTRY_VALIDATED)) continue; /* * Calling storeRelease() has no effect because we're * still in 'store_rebuilding' state */ if (e->swap_filen < 0) continue; if (opt_store_doublecheck) if (storeCleanupDoubleCheck(e)) store_errors++; EBIT_SET(e->flags, ENTRY_VALIDATED); /* * Only set the file bit if we know its a valid entry * otherwise, set it in the validation procedure */ storeDirUpdateSwapSize(&Config.cacheSwap.swapDirs[e->swap_dirn], e->swap_file_sz, 1); /* Get rid of private objects. Not useful */ if (EBIT_TEST(e->flags, KEY_PRIVATE)) storeRelease(e); if ((++validnum & 0x3FFFF) == 0) debug(20, 1) (" %7d Entries Validated so far.\n", validnum); } } eventAdd("storeCleanup", storeCleanup, NULL, 0.0, 1); }
static void free_StoreUpdateState(void *data) { StoreUpdateState *state = data; if (state->sc) storeClientUnregister(state->sc, state->oldentry, state); if (state->oldentry) storeUnlockObject(state->oldentry); if (state->newentry) { /* Set to NULL on completion, so we only get here in abnormal situations */ storeRelease(state->newentry); storeComplete(state->newentry); storeUnlockObject(state->newentry); } }
void storeRecycle(StoreEntry * e) { if (e->swap_dirn >= 0 && !storeEntryLocked(e)) { SwapDir *SD = INDEXSD(e->swap_dirn); /* Expire the object */ storeExpireNow(e); storeReleaseRequest(e); /* Make the cache_dir forget about it */ SD->obj.recycle(SD, e); } /* Finally make the store layer forget about this object */ storeRelease(e); }
void LazyInstanceState::doneConstructing() { storeRelease(&mState, STATE_DONE); }