2121#include < string>
2222#include < mutex>
2323
24+ #include " hexport.h"
2425#include " hbuf.h"
2526#include " hstring.h"
2627#include " LRUCache.h"
2728
28- // Forward declare to avoid header pollution
29- struct file_cache_ex_s ;
30-
3129// Default values — may be overridden at runtime via FileCacheEx setters
3230#define FILECACHE_EX_DEFAULT_HEADER_LENGTH 4096 // 4K
3331#define FILECACHE_EX_DEFAULT_MAX_NUM 100
@@ -59,8 +57,8 @@ typedef struct file_cache_ex_s {
5957 memset (etag, 0 , sizeof (etag));
6058 }
6159
62- // Fixed: avoids shadowing struct stat member with stat() call
63- // NOTE: caller must hold mutex
60+ // NOTE: caller must hold mutex.
61+ // On Windows, Open() uses _wstat() directly instead of calling this.
6462 bool is_modified () {
6563 time_t mtime = st.st_mtime ;
6664 ::stat (filepath.c_str(), &st);
@@ -74,9 +72,9 @@ typedef struct file_cache_ex_s {
7472 }
7573
7674 // NOTE: caller must hold mutex — invalidates filebuf/httpbuf pointers
77- void resize_buf (int filesize, int reserved) {
75+ void resize_buf (size_t filesize, int reserved) {
7876 header_reserve = reserved;
79- buf.resize (reserved + filesize);
77+ buf.resize (( size_t ) reserved + filesize);
8078 filebuf.base = buf.base + reserved;
8179 filebuf.len = filesize;
8280 // Invalidate httpbuf since buffer may have been reallocated
@@ -85,17 +83,17 @@ typedef struct file_cache_ex_s {
8583 header_used = 0 ;
8684 }
8785
88- void resize_buf (int filesize) {
86+ void resize_buf (size_t filesize) {
8987 resize_buf (filesize, header_reserve);
9088 }
9189
9290 // Thread-safe: prepend header into reserved space.
9391 // Returns true on success, false if header exceeds reserved space.
9492 bool prepend_header (const char * header, int len) {
9593 std::lock_guard<std::mutex> lock (mutex);
96- if (len > header_reserve) return false ;
94+ if (len <= 0 || len > header_reserve) return false ;
9795 httpbuf.base = filebuf.base - len;
98- httpbuf.len = len + filebuf.len ;
96+ httpbuf.len = ( size_t ) len + filebuf.len ;
9997 memcpy (httpbuf.base , header, len);
10098 header_used = len;
10199 return true ;
@@ -105,12 +103,12 @@ typedef struct file_cache_ex_s {
105103 int get_header_reserve () const { return header_reserve; }
106104 int get_header_used () const { std::lock_guard<std::mutex> lock (mutex); return header_used; }
107105 int get_header_remaining () const { std::lock_guard<std::mutex> lock (mutex); return header_reserve - header_used; }
108- bool header_fits (int len) const { return len <= header_reserve; }
106+ bool header_fits (int len) const { return len > 0 && len <= header_reserve; }
109107} file_cache_ex_t ;
110108
111109typedef std::shared_ptr<file_cache_ex_t > file_cache_ex_ptr;
112110
113- class FileCacheEx : public hv ::LRUCache<std::string, file_cache_ex_ptr> {
111+ class HV_EXPORT FileCacheEx : public hv::LRUCache<std::string, file_cache_ex_ptr> {
114112public:
115113 // --- configurable parameters (were hardcoded macros before) ---
116114 int stat_interval; // seconds between stat() checks
0 commit comments