680 Commits

Author SHA1 Message Date
木头云
7d09346ce5 feat(ci): exclude 3rdparty folder from codecov coverage
- Add codecov.yml configuration to exclude 3rdparty, test, and demo directories
- Update GitHub Actions workflow with exclude parameter in codecov-action
- Ensures only project source code is included in coverage metrics

This provides double protection:
1. codecov.yml filters on CodeCov service side
2. workflow exclude filters during upload
2025-12-10 05:05:01 +00:00
木头云
59a323a97b
Merge pull request #163 from mutouyun/genspark_ai_developer
feat(ci): Add CodeCov test coverage to master branch
2025-12-10 12:35:44 +08:00
木头云
a8e6c7ee39 feat(ci): add CodeCov workflow for test coverage reporting 2025-12-10 04:34:53 +00:00
mutouyun
b3847c1896 feat(ci): add codecov test coverage support to master branch
Add CodeCov test coverage configuration:
- Add LIBIPC_CODECOV option to CMakeLists.txt with coverage compilation flags
- Add CodeCov badge to README.md for coverage status display

Note: The codecov.yml workflow file needs to be added manually
or requires workflows permission to push.
2025-12-10 04:29:27 +00:00
木头云
5dd16c188a
Merge pull request #162 from mutouyun/feature/memory
feat: Memory management refactoring and MSVC compilation fixes
2025-12-09 14:13:28 +08:00
mutouyun
32244acf08 fix(platform): Add FreeBSD detection and include detect_plat.h in detail.h
Fixed two critical issues from the rebase:
1. Added LIBIPC_OS_FREEBSD macro definition in detect_plat.h to enable
   FreeBSD platform detection alongside other OS checks
2. Added missing #include "libipc/imp/detect_plat.h" in detail.h to
   properly include platform detection macros

These fixes ensure FreeBSD compilation will work correctly with the
unified platform detection system.
2025-12-09 04:02:18 +00:00
木头云
636d84b030 fix(shm_win): Use mem::$delete instead of mem::free in release()
The acquire() function allocates id_info_t using mem::$new<id_info_t>(),
so the release() function must use mem::$delete(ii) to deallocate it,
not mem::free(ii). This ensures proper allocation/deallocation pairing.

Issue: Memory allocated with mem::$new must be freed with mem::$delete
to maintain consistent memory management semantics.
2025-12-09 03:46:10 +00:00
木头云
c44e9fadcd fix(test): Update test.h include paths after master rebase
After rebasing onto master, test.h was moved to test/archive/.
Updated include paths in test subdirectories:
- test/imp/*.cpp: "test.h" -> "../archive/test.h"
- test/mem/*.cpp: "test.h" -> "../archive/test.h"
- test/concur/*.cpp: "test.h" -> "../archive/test.h"

This ensures all test files can properly find the test header
after the directory reorganization in master branch.
2025-12-09 03:46:10 +00:00
木头云
43b20b2f3e fix(msvc): Fix C4138 warning by adding space before commented parameter names
ISSUE:
MSVC compiler reports warning C4138: '*/' found outside of comment
for patterns like 'void */*p*/' where the pointer asterisk is immediately
followed by a comment start.

AFFECTED FILES:
- include/libipc/mem/new.h (line 30)
- src/libipc/platform/win/mutex.h (line 54)
- src/libipc/platform/win/semaphore.h (line 53)

CHANGES:
Changed 'type */*param*/' to 'type * /*param*/' (added space before comment)

Examples:
- void */*p*/       → void * /*p*/
- char const */*name*/ → char const * /*name*/

This resolves the MSVC warning while maintaining code functionality
and keeping the commented-out parameter names for documentation.
2025-12-09 03:46:10 +00:00
木头云
a83ba837d9 fix(test): Fix buffer overflow in data_set caused by array placement new
ROOT CAUSE:
Array placement new (::new(buffer) T[N]) adds a hidden cookie (array size)
before the array elements in some compiler implementations (particularly MSVC).
The cookie is used for proper array destruction. However, the data_set buffer
was sized only for sizeof(T[N]), not accounting for the cookie overhead.

ISSUE:
- Buffer allocated: sizeof(rand_buf[LoopCount])
- Actual space needed: sizeof(cookie) + sizeof(rand_buf[LoopCount])
- Result: Cookie and part of array written beyond buffer boundary
- Consequence: Memory corruption, leading to invalid pointers in buffer objects

SYMPTOM:
In IPC.1v1 test, memcpy(buf, data, size) crashed because 'data' pointer
(from buffer::data()) pointed to corrupted/invalid memory address.

SOLUTION:
Replace array placement new with individual element placement new:
- Cast buffer to array pointer directly (no cookie needed)
- Construct each element individually with placement new
- Manually destroy each element in destructor

This approach:
- Eliminates cookie overhead
- Provides precise control over object lifetime
- Works consistently across all compilers

Fixes crash in IPC.1v1 test case on MSVC.
2025-12-09 03:46:10 +00:00
木头云
11973b991b refactor(uninitialized): Improve construct() overload resolution
IMPROVEMENTS:
1. Add explicit zero-argument overload to avoid SFINAE ambiguity
2. Require at least one argument (A1) for parameterized overloads
3. Better separation between direct initialization and aggregate initialization

BENEFITS:
- Clearer intent: zero-argument construction is explicitly handled
- Avoids potential SFINAE ambiguity when empty parameter pack is used
- More maintainable: easier to understand which overload is selected
- Consistent with modern C++ best practices for variadic templates

TECHNICAL DETAILS:
- Zero-arg overload: Always uses T() for value initialization
- One-or-more-arg overload: Uses SFINAE to choose between:
  * T(args...) for types with matching constructor
  * T{args...} for aggregate types or types with initializer_list ctor

This is a code quality improvement and does not fix any compilation issues,
but provides better template overload resolution.
2025-12-09 03:46:10 +00:00
木头云
433855739f fix(container_allocator): Fix MSVC compilation by correcting allocator semantics
ROOT CAUSE:
The allocate() function was incorrectly constructing objects during memory
allocation, violating C++ allocator requirements. MSVC's std::_Tree_node has
a deleted default constructor, causing compilation failure.

CHANGES:
- container_allocator::allocate() now only allocates raw memory without
  constructing objects (removed mem::$new and ipc::construct calls)
- container_allocator::deallocate() now only frees memory without
  destroying objects (removed mem::$delete and ipc::destroy_n calls)

WHY THIS FIXES THE ISSUE:
C++ allocator semantics require strict separation:
  * allocate()   -> raw memory allocation only
  * construct()  -> object construction with proper arguments
  * destroy()    -> object destruction
  * deallocate() -> memory deallocation only

Standard containers (like std::map) call construct() with proper arguments
(key, value) to initialize nodes, not allocate(). Since std::_Tree_node in
MSVC has no default constructor (= delete), attempting to construct it
without arguments always fails.

Fixes MSVC 2017 compilation error:
  error C2280: 'std::_Tree_node<...>::_Tree_node(void)':
  attempting to reference a deleted function
2025-12-09 03:46:10 +00:00
mutouyun
29d2560a3c Replace custom hash struct with std::hash in unordered_map definition 2025-12-09 03:46:10 +00:00
mutouyun
c28b4a5066 Fix the issue caused by inconsistent lifecycle of the global IPC object. 2025-12-09 03:46:10 +00:00
mutouyun
8af5a617f0 Refactoring the generic memory allocator 2025-12-09 03:46:10 +00:00
mutouyun
fdb8cacdb3 Reimplement the allocator required for the container type with $new 2025-12-09 03:46:10 +00:00
mutouyun
ac9a24008b Use $new instead of alloc 2025-12-09 03:46:10 +00:00
mutouyun
7fd4041cd0 Simplify the implementation of memory allocation management 2025-12-09 03:46:10 +00:00
mutouyun
af2c4898af The memory allocator supports runtime dynamic size memory allocation 2025-12-09 03:46:10 +00:00
mutouyun
03a9bba68d libipc/memory/resource.h => libipc/mem/resource.h 2025-12-09 03:46:10 +00:00
mutouyun
ea041c781e Add $new 2025-12-09 03:46:10 +00:00
mutouyun
aaecfcfa8d Add block_pool 2025-12-09 03:46:10 +00:00
mutouyun
279c5f1234 Adjust the allocator name 2025-12-09 03:46:10 +00:00
mutouyun
81c7c42c35 Simplify verify_args function to fix error C3249 2025-12-09 03:46:10 +00:00
mutouyun
e006ba3f84 Fix fmt function to handle null pointers and return empty string 2025-12-09 03:46:10 +00:00
木头云
1a14e2a6c2 Update c-cpp.yml 2025-12-09 03:46:10 +00:00
mutouyun
c5a7a5de4a Fix fmt function to handle empty strings and update make_prefix template parameters 2025-12-09 03:46:10 +00:00
mutouyun
af6984e07a Optimize memory_resource & add monotonic_buffer_resource 2025-12-09 03:46:10 +00:00
mutouyun
664a34986e Add intrusive_stack 2025-12-09 03:46:10 +00:00
mutouyun
de217b4762 Add allocator and rewrite allocator_wrapper 2025-12-09 03:46:10 +00:00
mutouyun
9e9052f76b Optimized partial implementation using fmt 2025-12-09 03:46:10 +00:00
mutouyun
9ac82b6660 Start refactoring memory management, adding memory_resource 2025-12-09 03:45:01 +00:00
mutouyun
41352f9ee9 Update platform-specific feature macros to new interfaces in imp 2025-12-09 03:45:01 +00:00
mutouyun
3aba3a5fed Add system 2025-12-09 03:42:55 +00:00
mutouyun
8b433400f5 Add result 2025-12-09 03:42:55 +00:00
mutouyun
359e1aeba9 IPC_EXPORT => LIBIPC_EXPORT 2025-12-09 03:42:55 +00:00
mutouyun
6ce508bac9 Add log 2025-12-09 03:42:55 +00:00
mutouyun
78b1d04da4 Add error 2025-12-09 03:42:55 +00:00
mutouyun
a4b48e9a94 Added fmt support for byte 2025-12-09 03:42:55 +00:00
mutouyun
d32252b0a2 Add fmt 2025-12-09 03:42:55 +00:00
mutouyun
7f793986e0 Add codecvt 2025-12-09 03:42:55 +00:00
mutouyun
041970aa8c libimp => libipc 2025-12-09 03:42:55 +00:00
mutouyun
94cb6e6c8c Add nameof & scope_exit 2025-12-09 03:42:55 +00:00
mutouyun
838f416376 Move the export.h file to the imp directory 2025-12-09 03:42:55 +00:00
mutouyun
6831b0515c Add expected 2025-12-09 03:42:55 +00:00
mutouyun
62b9e287f7 Add imp for subsequent refactoring 2025-12-09 03:42:55 +00:00
mutouyun
ce0773b3e6 refactor: improve name handling in shm_posix.cpp to match semaphore pattern
Check if name already starts with '/' before adding prefix, consistent
with the pattern used in semaphore_impl.h. This avoids duplicate prefix
when users provide names in the correct format.
v1.4.0
2025-12-06 16:06:51 +08:00
木头云
addfe4f5cf
Merge pull request #161 from mutouyun/fix/freebsd-mutex-unlock-timing
Fix mutex unlock timing for FreeBSD multi-run stability
2025-12-06 15:22:27 +08:00
木头云
2593213d9c Fix FreeBSD shm_unlink failure by adding '/' prefix in remove()
Problem: Tests fail on the second run on FreeBSD with ShmTest.RemoveByName failing.
After the first test run completes, subsequent runs fail because shared memory
objects are not properly removed.

Root cause: FreeBSD's shm_unlink() is stricter than Linux about POSIX compliance.
The remove(char const * name) function was calling shm_unlink() without the '/'
prefix, while acquire() was using '/'+name format. This inconsistency caused:
- Linux: Silently tolerates both /name and name formats
- FreeBSD: Strictly requires /name format, shm_unlink("name") fails

When shm_unlink() fails to remove the shared memory object:
1. First test run creates /remove_by_name_test_1
2. Test calls shm::remove("remove_by_name_test_1")
3. shm_unlink("remove_by_name_test_1") fails on FreeBSD (missing '/')
4. Shared memory object remains in the system
5. Second test run tries to reuse the same name -> conflict -> test fails

Solution:
1. Fix remove(char const * name) to prepend '/' to the name for consistency
   with acquire() function, ensuring POSIX compliance
2. Add error checking for all shm_unlink() calls to log failures with errno

This ensures proper cleanup on FreeBSD and maintains compatibility with Linux.

Changes:
- Modified remove(char const * name) to use '/'+name format
- Added error logging for all three shm_unlink() calls
- Now consistent with POSIX requirement: shared memory names must be /somename

Tested on FreeBSD 15: Multiple consecutive test runs now pass without failures.
2025-12-06 07:20:33 +00:00
木头云
37f16cea47 Fix mutex unlock timing to avoid interfering with other references
Problem: The previous fix unconditionally called pthread_mutex_unlock() at the
beginning of close(), which could interfere with other threads/processes that
still had valid references to the mutex. This caused test failures on FreeBSD
when running tests multiple times (ShmTest.RemoveByName would fail on the second run).

Root cause: Calling unlock() too early could affect the mutex state for other
references that are still using it, leading to unexpected behavior.

Solution: Move pthread_mutex_unlock() to only be called when we're about to
destroy the mutex (i.e., when we're the last reference: shm_->ref() <= 1 &&
self_ref <= 1). This ensures:
1. We don't interfere with other threads/processes using the mutex
2. We still unlock before destroying to avoid FreeBSD robust list issues
3. The unlock happens at the correct time - right before pthread_mutex_destroy()

This is the correct approach because:
- Only the last reference holder should clean up the mutex
- Unlocking should be paired with destroying for the final cleanup
- Other references should not be affected by one reference closing

Fixes the second-run test failure on FreeBSD while maintaining the segfault fix.
2025-12-06 06:53:29 +00:00