mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-06 16:56:45 +08:00
printf failure-log
This commit is contained in:
parent
34ea7095d9
commit
b2e48fc138
@ -3,8 +3,12 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <new>
|
||||||
|
|
||||||
|
#include "rw_lock.h"
|
||||||
|
|
||||||
#include "platform/waiter.h"
|
#include "platform/waiter.h"
|
||||||
|
#include "platform/detail.h"
|
||||||
|
|
||||||
namespace ipc {
|
namespace ipc {
|
||||||
namespace circ {
|
namespace circ {
|
||||||
@ -38,9 +42,24 @@ constexpr u1_t index_of(u2_t c) noexcept {
|
|||||||
|
|
||||||
class conn_head {
|
class conn_head {
|
||||||
ipc::detail::waiter cc_waiter_, waiter_;
|
ipc::detail::waiter cc_waiter_, waiter_;
|
||||||
std::atomic<std::size_t> cc_; // connection counter
|
std::atomic<std::size_t> cc_ { 0 }; // connection counter
|
||||||
|
|
||||||
|
ipc::spin_lock lc_;
|
||||||
|
std::atomic<bool> constructed_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
void init() {
|
||||||
|
/* DCLP */
|
||||||
|
if (!constructed_.load(std::memory_order_acquire)) {
|
||||||
|
IPC_UNUSED_ auto guard = ipc::detail::unique_lock(lc_);
|
||||||
|
if (!constructed_.load(std::memory_order_relaxed)) {
|
||||||
|
::new (this) conn_head;
|
||||||
|
constructed_.store(true, std::memory_order_release);
|
||||||
|
::printf("init...\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
conn_head() = default;
|
conn_head() = default;
|
||||||
conn_head(const conn_head&) = delete;
|
conn_head(const conn_head&) = delete;
|
||||||
conn_head& operator=(const conn_head&) = delete;
|
conn_head& operator=(const conn_head&) = delete;
|
||||||
|
|||||||
@ -42,12 +42,14 @@ public:
|
|||||||
if (w_ == nullptr) return false;
|
if (w_ == nullptr) return false;
|
||||||
close();
|
close();
|
||||||
h_ = w_->open(name);
|
h_ = w_->open(name);
|
||||||
|
::printf("%s: %p\n", name, h_);
|
||||||
return valid();
|
return valid();
|
||||||
}
|
}
|
||||||
|
|
||||||
void close() {
|
void close() {
|
||||||
if (!valid()) return;
|
if (!valid()) return;
|
||||||
w_->close(h_);
|
w_->close(h_);
|
||||||
|
::printf("close %p\n", h_);
|
||||||
h_ = waiter_t::invalid();
|
h_ = waiter_t::invalid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -36,26 +36,32 @@ public:
|
|||||||
// init mutex
|
// init mutex
|
||||||
pthread_mutexattr_t mutex_attr;
|
pthread_mutexattr_t mutex_attr;
|
||||||
if (::pthread_mutexattr_init(&mutex_attr) != 0) {
|
if (::pthread_mutexattr_init(&mutex_attr) != 0) {
|
||||||
|
::printf("fail pthread_mutexattr_init\n");
|
||||||
return invalid();
|
return invalid();
|
||||||
}
|
}
|
||||||
IPC_UNUSED_ auto guard_mutex_attr = unique_ptr(&mutex_attr, ::pthread_mutexattr_destroy);
|
IPC_UNUSED_ auto guard_mutex_attr = unique_ptr(&mutex_attr, ::pthread_mutexattr_destroy);
|
||||||
if (::pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED) != 0) {
|
if (::pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED) != 0) {
|
||||||
|
::printf("fail pthread_mutexattr_setpshared\n");
|
||||||
return invalid();
|
return invalid();
|
||||||
}
|
}
|
||||||
if (::pthread_mutex_init(&mutex_, &mutex_attr) != 0) {
|
if (::pthread_mutex_init(&mutex_, &mutex_attr) != 0) {
|
||||||
|
::printf("fail pthread_mutex_init\n");
|
||||||
return invalid();
|
return invalid();
|
||||||
}
|
}
|
||||||
auto guard_mutex = unique_ptr(&mutex_, ::pthread_mutex_destroy);
|
auto guard_mutex = unique_ptr(&mutex_, ::pthread_mutex_destroy);
|
||||||
// init condition
|
// init condition
|
||||||
pthread_condattr_t cond_attr;
|
pthread_condattr_t cond_attr;
|
||||||
if (::pthread_condattr_init(&cond_attr) != 0) {
|
if (::pthread_condattr_init(&cond_attr) != 0) {
|
||||||
|
::printf("fail pthread_condattr_init\n");
|
||||||
return invalid();
|
return invalid();
|
||||||
}
|
}
|
||||||
IPC_UNUSED_ auto guard_cond_attr = unique_ptr(&cond_attr, ::pthread_condattr_destroy);
|
IPC_UNUSED_ auto guard_cond_attr = unique_ptr(&cond_attr, ::pthread_condattr_destroy);
|
||||||
if (::pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED) != 0) {
|
if (::pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED) != 0) {
|
||||||
|
::printf("fail pthread_condattr_setpshared\n");
|
||||||
return invalid();
|
return invalid();
|
||||||
}
|
}
|
||||||
if (::pthread_cond_init(&cond_, &cond_attr) != 0) {
|
if (::pthread_cond_init(&cond_, &cond_attr) != 0) {
|
||||||
|
::printf("fail pthread_cond_init\n");
|
||||||
return invalid();
|
return invalid();
|
||||||
}
|
}
|
||||||
// no need to guard condition
|
// no need to guard condition
|
||||||
|
|||||||
@ -1,5 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#if __has_include(<pthread.h>)
|
||||||
|
#include "waiter_linux.h"
|
||||||
|
#else /*!__has_include(<pthread.h>)*/
|
||||||
|
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -55,3 +59,5 @@ public:
|
|||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace ipc
|
} // namespace ipc
|
||||||
|
|
||||||
|
#endif/*!__has_include(<pthread.h>)*/
|
||||||
|
|||||||
11
src/queue.h
11
src/queue.h
@ -34,6 +34,7 @@ protected:
|
|||||||
if (elems == nullptr) {
|
if (elems == nullptr) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
elems->init();
|
||||||
dismiss_ = false;
|
dismiss_ = false;
|
||||||
return elems;
|
return elems;
|
||||||
}
|
}
|
||||||
@ -46,7 +47,9 @@ protected:
|
|||||||
}
|
}
|
||||||
assert(elems != nullptr);
|
assert(elems != nullptr);
|
||||||
waiter_.attach(&(elems->waiter()));
|
waiter_.attach(&(elems->waiter()));
|
||||||
waiter_.open((std::string{ "__IPC_WAITER__" } + name).c_str());
|
if (!waiter_.open((std::string{ "__IPC_WAITER__" } + name).c_str())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
cc_waiter_.attach(&(elems->conn_waiter()));
|
cc_waiter_.attach(&(elems->conn_waiter()));
|
||||||
cc_waiter_.open((std::string{ "__IPC_CC_WAITER__" } + name).c_str());
|
cc_waiter_.open((std::string{ "__IPC_CC_WAITER__" } + name).c_str());
|
||||||
}
|
}
|
||||||
@ -140,11 +143,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* not virtual */ ~queue_base(void) {
|
/* not virtual */ ~queue_base(void) {
|
||||||
if (!this->dismiss_ && (elems_ != nullptr)) {
|
base_t::close(elems_);
|
||||||
shm::release(elems_, sizeof(Elems));
|
|
||||||
}
|
|
||||||
dismiss_ = true;
|
|
||||||
// base_t::close(elems_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr elems_t * elems() const noexcept {
|
constexpr elems_t * elems() const noexcept {
|
||||||
|
|||||||
@ -24,7 +24,7 @@ private slots:
|
|||||||
|
|
||||||
void test_alloc_free();
|
void test_alloc_free();
|
||||||
void test_linear();
|
void test_linear();
|
||||||
} unit__;
|
} /*unit__*/;
|
||||||
|
|
||||||
#include "test_mem.moc"
|
#include "test_mem.moc"
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user