ImSQL
C++ 기반 SQL 자동화 및 라이선스 관리 엔진
Loading...
Searching...
No Matches
smartptr.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#ifndef SMARTPTR_H
10#define SMARTPTR_H
11
12#include <memory>
13#include <mutex>
14#include <cstdlib>
15#include <cstdio>
16#include <cstring>
17#include <string>
18
19#ifdef _WIN32
20 #include <winsock2.h>
21 #include <ws2tcpip.h>
22 #pragma comment(lib, "ws2_32.lib")
23#else
24 #include <netdb.h>
25 #include <arpa/inet.h>
26 #include <unistd.h>
27#endif
28
30#define RETAIN_SHARED_PTR(ptr) smartptr::retain(ptr)
31
33#define RELEASE_SHARED_PTR(ptr) smartptr::release(ptr)
34
35namespace smartptr {
36
41inline void default_deleter(void* ptr) {
42 std::free(ptr);
43}
44
49 char ip[INET_ADDRSTRLEN];
50 int family;
51};
52
58 NetworkInfo net_info{};
59
60#ifdef _WIN32
61 WSADATA wsaData;
62 WSAStartup(MAKEWORD(2, 2), &wsaData);
63#endif
64
65 char hostname[256];
66 if (gethostname(hostname, sizeof(hostname)) != 0) {
67 perror("gethostname failed");
68 std::exit(EXIT_FAILURE);
69 }
70
71 struct addrinfo hints{}, *res;
72 hints.ai_family = AF_INET;
73 hints.ai_socktype = SOCK_STREAM;
74 hints.ai_flags = AI_PASSIVE;
75
76 if (getaddrinfo(hostname, nullptr, &hints, &res) != 0) {
77 perror("getaddrinfo failed");
78 std::exit(EXIT_FAILURE);
79 }
80
81 auto* ipv4 = (struct sockaddr_in*)res->ai_addr;
82 inet_ntop(AF_INET, &(ipv4->sin_addr), net_info.ip, INET_ADDRSTRLEN);
83 net_info.family = res->ai_family;
84
85 freeaddrinfo(res);
86
87#ifdef _WIN32
88 WSACleanup();
89#endif
90
91 return net_info;
92}
93
97struct SharedPtr {
98 void* ptr = nullptr;
99 int* ref_count = nullptr;
100 std::mutex* mutex = nullptr;
101 void (*deleter)(void*) = default_deleter;
102};
103
110inline SharedPtr create(size_t size, void (*deleter)(void*) = default_deleter) {
111 SharedPtr sp;
112 sp.ptr = std::malloc(size);
113 sp.ref_count = (int*)std::malloc(sizeof(int));
114 *sp.ref_count = 1;
115 sp.mutex = new std::mutex();
116 sp.deleter = deleter;
117 return sp;
118}
119
124inline void retain(SharedPtr* sp) {
125 sp->mutex->lock();
126 ++(*sp->ref_count);
127 sp->mutex->unlock();
128}
129
134inline void release(SharedPtr* sp) {
135 sp->mutex->lock();
136 if (--(*sp->ref_count) == 0) {
137 sp->deleter(sp->ptr);
138 std::free(sp->ref_count);
139 sp->mutex->unlock();
140 delete sp->mutex;
141 sp->ptr = nullptr;
142 sp->ref_count = nullptr;
143 sp->mutex = nullptr;
144 } else {
145 sp->mutex->unlock();
146 }
147}
148
152struct UniquePtr {
153 void* ptr = nullptr;
154 void (*deleter)(void*) = default_deleter;
155};
156
163inline UniquePtr make_unique(size_t size, void (*deleter)(void*) = default_deleter) {
164 UniquePtr up;
165 up.ptr = std::malloc(size);
166 up.deleter = deleter;
167 return up;
168}
169
174inline void destroy(UniquePtr* up) {
175 if (up->ptr) {
176 up->deleter(up->ptr);
177 up->ptr = nullptr;
178 }
179}
180
187 UniquePtr new_up = *up;
188 up->ptr = nullptr;
189 return new_up;
190}
191
192} // namespace smartptr
193
194#endif // SMARTPTR_H // end of SmartPointer
void retain(SharedPtr *sp)
SharedPtr의 참조 카운트를 증가시킵니다.
Definition smartptr.hpp:124
void default_deleter(void *ptr)
기본 메모리 해제 함수.
Definition smartptr.hpp:41
void destroy(UniquePtr *up)
UniquePtr이 가리키는 메모리를 해제합니다.
Definition smartptr.hpp:174
SharedPtr create(size_t size, void(*deleter)(void *)=default_deleter)
SharedPtr을 생성합니다.
Definition smartptr.hpp:110
UniquePtr make_unique(size_t size, void(*deleter)(void *)=default_deleter)
UniquePtr을 생성합니다.
Definition smartptr.hpp:163
NetworkInfo get_local_network_info()
로컬 시스템의 IPv4 네트워크 정보를 가져옵니다.
Definition smartptr.hpp:57
void release(SharedPtr *sp)
SharedPtr의 참조 카운트를 감소시키고, 필요 시 메모리를 해제합니다.
Definition smartptr.hpp:134
UniquePtr transfer(UniquePtr *up)
UniquePtr의 소유권을 다른 UniquePtr로 이전합니다.
Definition smartptr.hpp:186
네트워크 정보 구조체 (IPv4 전용).
Definition smartptr.hpp:48
char ip[INET_ADDRSTRLEN]
IP 주소 (문자열)
Definition smartptr.hpp:49
int family
주소 패밀리 (AF_INET 등)
Definition smartptr.hpp:50
수동 참조 카운트를 가지는 Smart Shared Pointer 구조체.
Definition smartptr.hpp:97
int * ref_count
참조 카운트 포인터
Definition smartptr.hpp:99
void(* deleter)(void *)=default_deleter
메모리 해제 함수
Definition smartptr.hpp:101
void * ptr
실제 데이터 포인터
Definition smartptr.hpp:98
std::mutex * mutex
참조 카운트 보호용 뮤텍스
Definition smartptr.hpp:100
고유 소유권을 가지는 Unique Pointer 구조체.
Definition smartptr.hpp:152
void(* deleter)(void *)=default_deleter
메모리 해제 함수
Definition smartptr.hpp:154
void * ptr
실제 데이터 포인터
Definition smartptr.hpp:153