디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

Clair.Event_Loop 구현 완료함. ㅋㅋ 현재 손적화 중

나르시갤로그로 이동합니다. 2025.11.26 17:46:06
조회 118 추천 0 댓글 10
														

최적화란.. 최씨 무인정권이 적화통일하는 거라는

우스게소리.. 웃기긴 하다.


소스코드는 다음과 같습니다.

.ads 파일은 c언어에 비유하자면 .h 같은 성격의 파일입니다.

외부에 노출되는 API죠.


변수 관련하여 한가지 최적화하고..

구글 제미니, MS 코파일럿에 소스코드 입력하여

조언 받아 인공 최적화하고 있습니다. ㅋㅋㅋ

최상의 결과물이 나오고 있습니다.

0 오버헤드라는 것이 특징입니다.

이벤트 추가 삭제에 O(1) 시간 소요됩니다.

해시맵이나 순서맵 등 맵을 사용하지 않았습니다.

링크드리스트 방식인데 링크가 Idle Source 객체 안에 들어 있습니다.

그 결과 idle 이벤트들을 줄줄히 실행 가능하고 삽입/삭제시 O(1) 시간이 걸립니다.

이론적으로 최상의 속도.

이러한 방식이 해시맵보다 빠릅니다. 해시맵도 이론적으로 O(1)이지만

메모리 소비, 리해싱, 해시 함수 때문에 방금 애기한 침입형 링크드리스트 방식보다는

상대적으로 느립니다.

그러면 등록한 이벤트를 어떻게 찾느냐? 그것은 kqueue 및 epoll이 알아서 해줍니다.

이벤트를 등록할 때 kqueue의 udata (사용자 데이터)에 Source 포인터를 넘깁니다. ㅎㅎ

source 레코드에 ident, event mask, callback, user_data 등이 들어 있지요.

그에 대핸 포인터를 kqueue의 udata로 넘긴거지요.



-- clair-event_loop.ads
-- Copyright (c) 2021-2025 Hodong Kim <hodong@nimfsoft.art>
--
-- Permission to use, copy, modify, and/or distribute this software for any
-- purpose with or without fee is hereby granted.
--
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
--

with Clair.File;
with Interfaces.C;
with System;

package Clair.Event_Loop is
use type Interfaces.C.int;

-----------------------------------------------------------------------------
-- [Time Definitions] 64-bit Milliseconds
-----------------------------------------------------------------------------
type Milliseconds is new Interfaces.C.long_long;

INFINITE : constant Milliseconds := -1;
IMMEDIATE : constant Milliseconds := 0;

-----------------------------------------------------------------------------
-- [Handle & Context] Opaque Types
-----------------------------------------------------------------------------
type Context is limited private;

-- 사용자는 Handle이 무엇인지(포인터인지 정수인지) 모릅니다.
type Handle is private;
NULL_HANDLE : constant Handle;

-----------------------------------------------------------------------------
-- [Callbacks] Type Safety
-----------------------------------------------------------------------------
-- 1. I/O 감시용
type Event_Mask is new Interfaces.C.unsigned;

EVENT_INPUT : constant Event_Mask := 16#001#; -- same as EPOLLIN
EVENT_OUTPUT : constant Event_Mask := 16#004#; -- same as EPOLLOUT
EVENT_ERROR : constant Event_Mask := 16#008#; -- same as EPOLLERR
EVENT_HANG_UP : constant Event_Mask := 16#010#; -- same as EPOLLHUP

-- 1. I/O 감시용
type IO_Callback is access procedure (
fd : Clair.File.Descriptor;
events : Event_Mask;
user_data : System.Address
) with convention => c;

-- 2. 타이머용 (자신의 핸들을 받아 삭제 가능)
type Timer_Callback is access procedure (
timer : Handle;
user_data : System.Address
) with convention => c;

-- 아이들 전용 콜백
type Idle_Callback is access procedure (
idle : Handle;
user_data : System.Address
) with convention => c;

-- 시그널 콜백
-- signum: 발생한 시그널 번호 (예: SIGINT=2, SIGTERM=15)
type Signal_Callback is access procedure (
signum : Interfaces.C.int;
user_data : System.Address
) with convention => c;
-----------------------------------------------------------------------------
-- [Public API]
-----------------------------------------------------------------------------
function create return Context;
procedure destroy (self : in out Context);

procedure run (self : in out Context);
procedure stop (self : in out Context);

-- 루프의 한 사이클을 실행
-- 이벤트를 확인하고, 준비된 이벤트가 있다면 콜백을 실행한 뒤 복귀합니다.
-- timeout: 밀리초 단위. 음수면 무한 대기.
procedure iterate (self : in out Context;
timeout : Milliseconds := INFINITE);


function add_watch (
self : in out Context;
fd : Clair.File.Descriptor;
events : Event_Mask;
callback : IO_Callback;
user_data : System.Address := System.NULL_ADDRESS
) return Handle;

function add_timer (
self : in out Context;
interval : Milliseconds;
callback : Timer_Callback;
user_data : System.Address := System.NULL_ADDRESS;
one_shot : Boolean := False
) return Handle;

-- Idle 추가: 루프가 돌 때마다 실행됩니다.
function add_idle (
self : in out Context;
callback : Idle_Callback;
user_data : System.Address := System.NULL_ADDRESS
) return Handle;

procedure remove (
self : in out Context;
target : Handle
);

procedure modify_watch (
self : in out Context;
watch : Handle;
events : Event_Mask
);


function add_unix_signal (
self : in out Context;
signum : Interfaces.C.int;
callback : Signal_Callback;
user_data : System.Address := System.NULL_ADDRESS
) return Handle;

private

-----------------------------------------------------------------------------
-- [Internal Data Structures] Pointer + RefCount + Variant Record
-----------------------------------------------------------------------------
-- 1. 리소스의 종류를 식별하는 열거형
type Source_Kind is (KIND_WATCH, KIND_TIMER, KIND_IDLE, KIND_SIGNAL);
type Source; -- Forward declaration
type Source_Access is access all Source;
pragma convention (c, Source_Access);

type Handle is new Source_Access;
NULL_HANDLE : constant Handle := null;

-- 2. 가변 레코드 (variant record)
-- kind(판별자)에 따라 구조가 변합니다.
type Source (kind : Source_Kind := KIND_WATCH) is record
-- [공통 필드] 모든 종류가 공유하는 데이터
ref_count : Integer := 1; -- 참조 카운트 (0이 되면 free)
is_closed : Boolean := False; -- 논리적 삭제 여부 (zombie check)
user_data : System.Address;
-- [가변 필드] Kind에 따라 달라지는 데이터
case kind is
when KIND_WATCH =>
fd : Clair.File.Descriptor; -- 파일 디스크립터
events : Event_Mask; -- 감시 중인 이벤트 마스크
io_cb : IO_Callback; -- I/O 전용 콜백

when KIND_TIMER =>
timer_cb : Timer_Callback; -- 타이머 전용 콜백
-----------------------------------------------------------------------
-- [Platform-Specific Identifier] 플랫폼별 타이머 식별자
-----------------------------------------------------------------------
-- 이 필드는 운영체제 커널이 타이머를 구별하고 제어(삭제)하기 위해
-- 요구하는 고유 값을 저장합니다. OS 구현 방식에 따라 용도가 다릅니다.
--
-- 1. Linux (epoll + timerfd):
-- 'timerfd_create'가 반환한 **파일 디스크립터(FD)**를 반드시 저장해야 합니다.
-- (삭제 시 close(Ident) 호출 필요)
--
-- 2. BSD (kqueue):
-- 'kevent' 구조체의 **'ident'** 필드 값을 저장하는 용도입니다.
--
-- [구현 노트 - 최적화]
-- 구현 전략에 따라, 별도의 ID를 발급하지 않고 **Source 객체의 메모리 주소(Handle)**
-- 그 자체를 정수로 변환하여 kqueue의 ident로 사용할 수 있습니다.
-- 이 경우, **본 필드(Ident)는 사용되지 않거나(Unused)**,
-- 주소값을 중복 저장하는 용도로 사용될 수 있습니다.
--
-- * 타입 선정: 64비트 포인터 주소값 저장을 보장하기 위해 unsigned_long_long 사용.
-----------------------------------------------------------------------
ident : Interfaces.C.unsigned_long_long;

when KIND_IDLE =>
idle_cb : Idle_Callback; -- 아이들 전용 콜백
idle_next : Handle;
idle_prev : Handle; -- 삭제 편의를 위해 이중 연결 리스트 추천

when KIND_SIGNAL =>
sig_num : Interfaces.C.int; -- 시그널 번호
sig_cb : Signal_Callback; -- 콜백
-- [Linux 호환성]
-- kqueue는 필요 없지만, epoll은 signalfd로 만든 FD를 저장해야 삭제(close) 가능
sig_fd : Clair.File.Descriptor := Clair.File.INVALID_DESCRIPTOR; -- -1
end case;
end record;


type Timespec is record
tv_sec : Interfaces.C.long;
tv_nsec : Interfaces.C.long;
end record;
pragma convention (c, Timespec);

type Context is limited record
fd : Clair.File.Descriptor;
is_running : Boolean := False;
-- 캐싱된 타임아웃 (비교용, 64비트 정수)
cached_timeout : Milliseconds := INFINITE;
cached_timespec : Timespec := (others => 0);
-- idle 관리
call_depth : Natural := 0;
idle_head : Handle := NULL_HANDLE; -- 리스트의 시작
idle_tail : Handle := NULL_HANDLE; -- 리스트의 끝 (빠른 추가용)
idle_count : Natural := 0;
end record;

end Clair.Event_Loop;

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 연말 모임 가는 곳마다 가장 인싸일 것 같은 스타는? 운영자 25/12/08 - -
AD 루틴 ON! 운동 찐템! 지금 할인 중 운영자 25/11/27 - -
2906442 위메이드플레이 개발업계 중에서 어느정도임?? [1] 프갤러(106.101) 12.04 60 0
2906441 안드로이드 소스 잘 아는 사람 프갤러(211.213) 12.04 62 0
2906439 한국 테크 기업중에 화교한테 안먹힌 회사가 없구만 [3] RyuDOG갤로그로 이동합니다. 12.04 120 0
2906434 폐쇄망에서 쓸 수 있는 AI비서 개발 어떻게 생각함 [1] 프갤러(35.194) 12.04 82 0
2906433 [대한민국] 트럼프 대통령 부정선거 리트루스, 윤석열 대통령 메시지 ㅇㅇ(121.172) 12.04 53 0
2906432 ERP랑 붙어서 인터페이스 연동테스트하는데 한방에 됨 ㅇ ㅅㅇ; [1] 프갤러(60.196) 12.04 73 0
2906431 러스트도 액터 모델 쓸 수 있다. [3] 프갤러(221.149) 12.04 91 0
2906427 아침 해가 돌아나오는 골목 ㅇㅅㅇ [5] 헤르 미온느갤로그로 이동합니다. 12.04 94 0
2906424 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 12.04 53 0
2906423 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 12.04 80 0
2906422 실시간 next js 쓰는 사람들 w된거 같다 ㅇㅇ(1.244) 12.04 110 1
2906421 쿠팡 물량이 좀 줄은거 같다..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 12.04 71 0
2906420 흐미.. 소프트웨어 언어/기술 혐오가 너무 심한거 아닌가.. [4] 나르시갤로그로 이동합니다. 12.04 89 0
2906416 워드프레스, 그누보드는 상 쓰레기코드다 프갤러(118.235) 12.04 87 0
2906415 러스트 동시성은반쪽이다 얼랭/엘릭서해라 [1] 프갤러(61.75) 12.04 229 2
2906414 나는 오늘도 아무도 못알아볼 보고서를 쓴다. [3] ㅇㅇ(118.235) 12.04 100 1
2906413 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥발라당냥덩♥갤로그로 이동합니다. 12.04 79 0
2906412 인지과학조져라 손발이시립디다갤로그로 이동합니다. 12.04 78 0
2906409 커뮤 왜 중독되는지 알겠다. [2] 프갤러(112.171) 12.04 119 0
2906406 길다가가 처음 보는 젊은 여자가 [1] RyuDOG갤로그로 이동합니다. 12.04 121 0
2906403 평온하다 이제 옷을 벗을 시기가 다가오니 [1] RyuDOG갤로그로 이동합니다. 12.04 116 0
2906400 손바닥 낙서 발명도둑잡기(118.216) 12.04 109 0
2906398 참사모욕글 제3자가 고발해서 벌금전과 생겼는데 억울한거지? ㅇㅇ(39.7) 12.04 46 0
2906397 스위스 직접민주주의 비판론 발명도둑잡기(118.216) 12.04 75 0
2906395 gpt로 글쓰는 새끼들 존나패고싶음 [5] 박민준갤로그로 이동합니다. 12.04 135 0
2906394 음기 충전 발명도둑잡기(118.216) 12.04 87 0
2906390 나토리 ..❤+ [2] 따당갤로그로 이동합니다. 12.04 117 0
2906388 윤석열 내란 당시 방송국 발명도둑잡기(118.216) 12.04 88 0
2906383 마술쇼 [6] ♥발라당냥덩♥갤로그로 이동합니다. 12.03 106 0
2906382 스윽.. 스윽.. [7] ♥발라당냥덩♥갤로그로 이동합니다. 12.03 133 0
2906381 “시진핑 G7 초청 신중하라”…프랑스 압박한 日 / 채널A 발명도둑잡기(118.216) 12.03 38 0
2906380 임베디드하라니깐 타이밍뒷.통수한방(1.213) 12.03 87 1
2906378 응원봉 들고 'K팝' 합창‥'다시 만난 세계' 연 새 집회문화 발명도둑잡기(118.216) 12.03 50 0
2906376 블프에 해외 직구 했는데 [4] RyuDOG갤로그로 이동합니다. 12.03 92 0
2906375 조국혁신당이 미래다 이기이기 타이밍뒷.통수한방(1.213) 12.03 61 0
2906374 간첩법 개정안, 법사위 통과…적용 범위 ‘적국’→‘외국’ 확대 발명도둑잡기(118.216) 12.03 73 0
2906373 4년 전과 달라진 ‘혐중’ 정서 분석해보니 발명도둑잡기(118.216) 12.03 93 0
2906372 "한국 극우, 분노 자극하지만 욕망을 자극하지 못한다" 발명도둑잡기(118.216) 12.03 79 0
2906368 백엔드 공부 안했으면 취업 못하는 게 맞나 [2] ㅇㅇ(118.40) 12.03 127 0
2906367 생성형 머신러닝 공부 중이다. Move갤로그로 이동합니다. 12.03 57 0
2906366 토발즈는 유퀴즈 언제 나오누?? 타이밍뒷.통수한방(1.213) 12.03 59 0
2906365 개인통관고유번호 유출이 무서운 이유 발명도둑잡기(118.216) 12.03 62 0
2906363 "건물만한 풍선이 미군 레이더엔 안 보였다?"... '외환죄' 발명도둑잡기(118.216) 12.03 63 0
2906360 PHP는 웹 개발, 특히 서버 [7] 나르시갤로그로 이동합니다. 12.03 107 0
2906359 "너무 좋아" 차트 1위 휩쓸었는데…"말도 안 돼" 반전 정체 발명도둑잡기(118.216) 12.03 53 0
2906358 도로롱은 귀여운데 프릭컬은 안 귀여움 [11] ♥발라당냥덩♥갤로그로 이동합니다. 12.03 91 0
2906356 김현지에 충성하면 요직 독점? 국가 인사시스템 완전히 붕괴 ♥발라당냥덩♥갤로그로 이동합니다. 12.03 72 1
2906355 중국산 '초저가' 극초음속 미사일 등장…세계 방산시장 흔들? 발명도둑잡기(118.216) 12.03 52 0
2906354 민주당 김남국 이재명 권력 김현지에게 부정청탁 발각 논란 일파만파 ♥발라당냥덩♥갤로그로 이동합니다. 12.03 70 0
2906352 코드를 치는것보다 cs 과목들 깊게 공부하는게 너무 재밌습니다 [1] 프갤러(211.234) 12.03 86 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2