My Project
Loading...
Searching...
No Matches
kernel_uniqueptr.h
Go to the documentation of this file.
1#pragma once
2#ifndef KERNEL_UNIQUEPTR_H
3#define KERNEL_UNIQUEPTR_H
4
5#include <dlfcn.h>
6#include <pthread.h>
7#include <stdlib.h>
8#include <stdio.h>
9#include <string.h>
10#include <stdarg.h>
11#include <errno.h>
12#include <sys/types.h>
13#include <sys/socket.h>
14#include <fcntl.h>
15#include <unistd.h>
16#include <sys/wait.h>
17#include <semaphore.h>
18#include <stdbool.h>
19#include <netdb.h>
20#include <arpa/inet.h>
21#include "kernel_print.h"
22#include "kernel_engine.h"
23
24#include "../src/ename.c.inc" // 파일의 상대 경로로 수정
25
26
27#define BUF_SIZE 100
28#define NUM_THREADS 3
29#define MAX_STRING_SIZE 100
30
31#define RETAIN_SHARED_PTR(ptr) retain_shared_ptr(ptr);
32#define RELEASE_SHARED_PTR(ptr) release_shared_ptr(ptr);
33
39void default_deleter(void *ptr) {
40 free(ptr);
41}
42
47typedef struct {
48 void *ptr;
49 int *ref_count;
50 pthread_mutex_t *mutex;
51 void (*deleter)(void*);
52} SharedPtr;
53
58typedef struct {
59 void *ptr;
60 void (*deleter)(void*);
61} UniquePtr;
62
70SharedPtr create_shared_ptr(size_t size, void (*deleter)(void*)) {
71 SharedPtr sp;
72 sp.ptr = malloc(size);
73 sp.ref_count = (int*)malloc(sizeof(int));
74 *(sp.ref_count) = 1;
75 sp.mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
76 sp.deleter = deleter ? deleter : default_deleter;
77 pthread_mutex_init(sp.mutex, NULL);
78
79 return sp;
80}
81
89UniquePtr create_unique_ptr(size_t size, void (*deleter)(void*)) {
90 UniquePtr up;
91 up.ptr = malloc(size);
92 up.deleter = deleter ? deleter : default_deleter;
93 return up;
94}
95
102 pthread_mutex_lock(sp->mutex);
103 (*(sp->ref_count))++;
104 pthread_mutex_unlock(sp->mutex);
105}
106
113 if (sp->ptr == NULL) {
114 safe_kernel_printf("SharedPtr is already released\n");
115 return;
116 }
117
118 sp->deleter(sp->ptr);
119 sp->ptr = NULL;
120
121 free(sp->ref_count);
122 sp->ref_count = NULL;
123 pthread_mutex_destroy(sp->mutex);
124 free(sp->mutex);
125 sp->mutex = NULL;
126}
127
134 if (up->ptr) {
135 up->deleter(up->ptr);
136 up->ptr = NULL;
137 }
138}
139
147 UniquePtr new_up = *up;
148 up->ptr = NULL;
149 return new_up;
150}
151
158void* thread_function_shared(void* arg) {
159 SharedPtr *sp = (SharedPtr*)arg;
161 printf("스레드에서 shared_ptr 사용 중 - ref_count: %d\n", *(sp->ref_count));
162
163 sleep(1);
164
166 return NULL;
167}
168
175void* thread_function_unique(void* arg) {
176 (void)arg; // Ignore the unused variable
177 printf("스레드에서 unique_ptr 사용 중\n");
178
179 sleep(1);
180 return NULL;
181}
182
183#endif // KERNEL_UNIQUEPTR_H
void safe_kernel_printf(const char *format,...)
스레드 안전한 출력 함수 선언
SharedPtr create_shared_ptr(size_t size, void(*deleter)(void *))
shared_ptr 생성 함수
void default_deleter(void *ptr)
기본 소멸자 함수 (free 사용)
void release_unique_ptr(UniquePtr *up)
unique_ptr 메모리 해제
void * thread_function_unique(void *arg)
스레드 함수 (unique_ptr 사용)
void release_shared_ptr(SharedPtr *sp)
shared_ptr 참조 카운트 감소 및 메모리 해제
UniquePtr create_unique_ptr(size_t size, void(*deleter)(void *))
unique_ptr 생성 함수
UniquePtr transfer_unique_ptr(UniquePtr *up)
unique_ptr 소유권 이전
void retain_shared_ptr(SharedPtr *sp)
shared_ptr 참조 카운트 증가
void * thread_function_shared(void *arg)
스레드 함수 (shared_ptr 사용)
공유 스마트 포인터
void(* deleter)(void *)
소멸자 함수
pthread_mutex_t * mutex
뮤텍스
void * ptr
실제 메모리
int * ref_count
참조 카운트
고유 스마트 포인터
void(* deleter)(void *)
소멸자 함수
void * ptr
실제 메모리