내용 목차
본 장에서는 실제 애플리케이션 개발을 위한 API의 사용법에 대해서 소개한다.
TDL API는 Tmax 서버나 클라이언트 라이브러리에 포함되어 있으며, tdlcall.h 헤더 파일을 포함(include)시켜야 한다. Tmax 서버의 경우 TCS와 UCS 타입만 지원하며 클라이언트의 경우 멀티 스레드 라이브러리에서는 지원하지 않는다. 다음은 TDL API의 목록이다.
API | 설명 |
---|---|
tdlcall | 최신 버전의 동적 모듈 함수를 호출하는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=1 또는 VERSION=2로 설정된 경우 사용 가능하다. |
tdlcall2 | 최신 버전의 동적 모듈 함수를 호출하는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=3으로 설정된 경우 사용 가능하다. |
tdlcall2v | 최신 버전의 동적 모듈 함수를 호출하는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=3으로 설정된 경우 사용 가능하다. |
tdlcall2s | 최신 버전의 동적 모듈 함수를 호출하는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=3으로 설정된 경우 사용 가능하다. |
tdlcallva | 최신 버전의 동적 모듈 함수를 호출하는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=1 또는 VERSION=2로 설정된 경우 사용 가능하다. |
tdlcallva2 | 최신 버전의 동적 모듈 함수를 호출하는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=3으로 설정된 경우 사용 가능하다. |
tdlcreate | 최신 버전의 동적 모듈에서 Class Factory를 사용하여 클래스 인스턴스를 생성하는 함수로, TDL 환경 파일(tdl.cfg)에 VERSION=4로 설정된 경우 사용 가능하다. |
tdldestroy | 최신 버전의 동적 모듈에서 Class Factory를 사용하여 클래스 인스턴스를 파괴하는 함수로, TDL 환경 파일(tdl.cfg)에 VERSION=4로 설정된 경우 사용 가능하다. |
tdlerror | tdlcall()에 대한 에러가 발생했을 때 문자열 형태로 변환하는 함수이다. |
tdlgetseqno | Global Sequence 번호를 가져오는 함수이다. |
tdlstart | 명시적 버전 정합성(Explicit Version Consistency) 유지가 시작된다. |
tdlend | 명시적 버전 정합성(Explicit Version Consistency) 유지가 종료된다. |
tdlsuspend | 일시적으로 버전 정합성 유지를 중지한다. |
tdlresume | 일시적으로 중지된 버전 정합성 유지를 재개하는 함수이다. |
tdlclose | 해당 모듈의 레퍼런스 카운트를 0으로 초기화 하거나 모듈을 직접 메모리에서 해제한다. |
tdlload | 공유 메모리에 모듈을 적재하는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=1 또는 VERSION=2로 설정된 경우 사용한다. |
tdlload2 | 공유 메모리에 모듈을 적재하는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=3으로 설정된 경우 사용한다. |
tdlinit | 공유 메모리를 초기 설정하는 함수이다. |
tdldone | 공유 메모리를 초기화 하는 함수이다. |
tdlfind | 모듈의 인덱스를 찾는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=1 또는 VERSION=2로 설정된 경우 사용한다. |
tdlfind2 | 모듈의 인덱스를 찾는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=3으로 설정된 경우 사용한다. |
tdlstat | TDL 통계 정보를 출력해주는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=1 또는 VERSION=2로 설정된 경우 사용한다. 환경설정에서 MONITOR=Y로 설정해야 한다. |
tdlstat2 | TDL 통계 정보를 출력해주는 함수로, TDL 환경 파일(tdl.cfg)의 VERSION=3으로 설정된 경우 사용한다. 환경설정에서 MONITOR=Y로 설정해야 한다. |
최신 버전의 동적 모듈 함수를 호출하는 함수로 동적 모듈 함수는 반드시 long funcname(void *args) 형태의 원형을 가져야 한다. TDL 환경 파일(tdl.cfg)의 VERSION이 1 또는 2로 설정되었을 때 사용 가능하다. 동적 모듈은 최초 tdlcall()될 때 로드되며 특별히 업데이트(tdlupdate)가 되지 않을 경우 재사용하여 성능 저하를 해소한다. 버전 정합성(Version Consistency) 유지 상황에서는 정합성을 반영한 버전이 사용된다.
프로토타입
#include <tdlcall.h> int tdlcall(char *funcname, void *args, long *urcode, int flags)
파라미터
파라미터 | 설명 |
---|---|
funcname | 동적 모듈의 함수명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
args | 호출될 동적 모듈 함수의 파라미터이다. |
urcode | 호출된 동적 모듈 함수의 반환값이다. |
flags | TDLTRAN으로 설정이 가능하며 이 경우에 urcode로 반드시 Global Sequence 번호를 전달해야 한다. 사용하지 않을 경우 TDL_NOFLAGS로 설정한다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 성공적으로 종료한 경우이다. |
TDL_OPEN_ERROR | dlopen()을 사용할 때 에러가 발생한 경우이다. |
TDL_SYM_ERROR | dlsym()을 사용할 때 에러가 발생한 경우이다. |
TDL_CLOSE_ERROR | dlclose()를 사용할 때 에러가 발생한 경우이다. |
TDL_SYSTEM_ERROR | 기타 시스템 콜을 사용하다가 에러가 발생한 경우이다. |
TDL_INT _ERROR | 라이브러리 내부에서 오류가 발생한 경우이다. |
TDL_ENOFUNC | 해당 모듈이나 함수를 찾을 수 없다. |
TDL_ENV_ERROR | 환경변수 설정에 오류가 있다. |
TDL_VER_ERROR | TDL 공유 메모리 버전과 환경 파일(tdl.cfg) 버전이 일치하지 않는다. |
TDL_ARG _ERROR | 잘못된 파라미터가 설정되었다. |
TDL_ENOLIB | 지정한 라이브러리를 찾을 수 없다. |
TDL_TRAN_ERROR | 버전 정합성 처리 중 에러가 발생했다. |
TDL_EINACTIVE | 모듈이 일시적으로 사용 중지된 상태이다. |
최신 버전의 동적 모듈 함수를 호출하는 함수로 라이브러리명과 함수명을 키로 사용한다. 동적 모듈 함수는 반드시 long funcname(void *args) 형태의 원형을 가져야 한다. 라이브러리명과 함수명을 키로 사용하는 것을 제외하고는 tdlcall() 함수와 동일한 기능을 제공한다.
동적 모듈 함수는 반드시 long funcname(void *args) 형태의 원형을 가져야 한다. TDL 환경 파일(tdl.cfg)에 VERSION=3으로 설정되었을 때 사용 가능하다.
프로토타입
#include <tdlcall.h> int tdlcall2(char *libname, char *funcname, void *args, long *urcode, int flags)
파라미터
파라미터 | 설명 |
---|---|
libname | 동적 모듈의 라이브러리명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
funcname | 동적 모듈의 함수명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
args | 호출될 동적 모듈 함수의 파라미터이다. |
urcode | 호출된 동적 모듈 함수의 반환값이다. |
flags | TDLTRAN으로 설정이 가능하며 이 경우에 urcode로 반드시 Global Sequence 번호를 전달해야 한다. 사용하지 않을 경우 TDL_NOFLAGS로 설정한다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 성공적으로 종료한 경우이다. |
TDL_OPEN_ERROR | dlopen()을 사용할 때 에러가 발생한 경우이다. |
TDL_SYM_ERROR | dlsym()을 사용할 때 에러가 발생한 경우이다. |
TDL_CLOSE_ERROR | dlclose()를 사용할 때 에러가 발생한 경우이다. |
TDL_SYSTEM_ERROR | 기타 시스템 콜을 사용하다가 에러가 발생한 경우이다. |
TDL_INT _ERROR | 라이브러리 내부에서 오류가 발생한 경우이다. |
TDL_ENOFUNC | 해당 모듈이나 함수를 찾을 수 없다. |
TDL_ENV_ERROR | 환경변수 설정에 오류가 있다. |
TDL_VER_ERROR | TDL 공유 메모리 버전과 환경 파일(tdl.cfg) 버전이 일치하지 않는다. |
TDL_ARG _ERROR | 잘못된 파라미터가 설정되었다. |
TDL_ENOLIB | 지정한 라이브러리를 찾을 수 없다. |
TDL_TRAN_ERROR | 버전 정합성 처리 중 에러가 발생했다. |
TDL_EINACTIVE | 모듈이 일시적으로 사용 중지된 상태이다. |
최신 버전의 동적 모듈 함수를 호출하는 함수로 라이브러리명과 함수명을 키로 사용한다. 동적 모듈 함수는 반드시 long funcname(int argc, char *argv[]) 형태의 원형을 가져야 한다.
라이브러리명과 함수명을 키로 사용하는 것을 제외하고는 tdlcall() 함수와 동일한 기능을 제공한다. TDL 환경 파일(tdl.cfg)에 VERSION=3으로 설정되었을 때 사용 가능하다.
프로토타입
#include <tdlcall.h> int tdlcall2v(char *libname, char *funcname, int argc, char *argv[], long *urcode, int flags)
파라미터
파라미터 | 설명 |
---|---|
libname | 동적 모듈의 라이브러리명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
funcname | 동적 모듈의 함수명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
argc | 호출될 동적 모듈 함수의 파라미터 개수이다. |
argv | 호출될 동적 모듈 함수의 파라미터 벡터이다. |
urcode | 호출된 동적 모듈 함수의 반환값이다. |
flags | TDLTRAN으로 설정이 가능하며 이 경우에 urcode로 반드시 Global Sequence 번호를 전달해야 한다. 사용하지 않을 경우 TDL_NOFLAGS로 설정한다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 성공적으로 종료한 경우이다. |
TDL_OPEN_ERROR | dlopen()을 사용할 때 에러가 발생한 경우이다. |
TDL_SYM_ERROR | dlsym()을 사용할 때 에러가 발생한 경우이다. |
TDL_CLOSE_ERROR | dlclose()를 사용할 때 에러가 발생한 경우이다. |
TDL_SYSTEM_ERROR | 기타 시스템 콜을 사용하다가 에러가 발생한 경우이다. |
TDL_INT _ERROR | 라이브러리 내부에서 오류가 발생한 경우이다. |
TDL_ENOFUNC | 해당 모듈이나 함수를 찾을 수 없다. |
TDL_ENV_ERROR | 환경변수 설정에 오류가 있다. |
TDL_VER_ERROR | TDL 공유 메모리 버전과 환경 파일(tdl.cfg) 버전이 일치하지 않는다. |
TDL_ARG _ERROR | 잘못된 파라미터가 설정되었다. |
TDL_ENOLIB | 지정한 라이브러리를 찾을 수 없다. |
TDL_TRAN_ERROR | 버전 정합성 처리 중 에러가 발생했다. |
TDL_EINACTIVE | 모듈이 일시적으로 사용 중지된 상태이다. |
최신 버전의 동적 모듈 함수를 호출하는 함수로 라이브러리명과 함수명을 키로 사용한다. 동적 모듈 함수는 반드시 long funcname(void *input, void *output) 형태의 원형을 가져야 한다.
라이브러리명과 함수명을 키로 사용하는 것을 제외하고는 tdlcall() 함수와 동일한 기능을 제공한다. TDL 환경 파일(tdl.cfg)에 VERSION=3으로 설정되었을 때 사용 가능하다.
프로토타입
#include <tdlcall.h> int tdlcall2s(char *libname, char *funcname, void *input, void *output, long *urcode, int flags)
파라미터
파라미터 | 설명 |
---|---|
libname | 동적 모듈의 라이브러리명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
funcname | 동적 모듈의 함수명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
input | 호출될 동적 모듈 함수의 입력 버퍼 포인터이다. |
output | 호출될 동적 모듈 함수의 출력 버퍼 포인터이다. |
urcode | 호출된 동적 모듈 함수의 반환값이다. |
flags | TDLTRAN으로 설정이 가능하며 이 경우에 urcode로 반드시 Global Sequence 번호를 전달해야 한다. 사용하지 않을 경우 TDL_NOFLAGS로 설정한다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 성공적으로 종료한 경우이다. |
TDL_OPEN_ERROR | dlopen()을 사용할 때 에러가 발생한 경우이다. |
TDL_SYM_ERROR | dlsym()을 사용할 때 에러가 발생한 경우이다. |
TDL_CLOSE_ERROR | dlclose()를 사용할 때 에러가 발생한 경우이다. |
TDL_SYSTEM_ERROR | 기타 시스템 콜을 사용하다가 에러가 발생한 경우이다. |
TDL_INT _ERROR | 라이브러리 내부에서 오류가 발생한 경우이다. |
TDL_ENOFUNC | 해당 모듈이나 함수를 찾을 수 없다. |
TDL_ENV_ERROR | 환경변수 설정에 오류가 있다. |
TDL_VER_ERROR | TDL 공유 메모리 버전과 환경 파일(tdl.cfg) 버전이 일치하지 않는다. |
TDL_ARG _ERROR | 잘못된 파라미터가 설정되었다. |
TDL_ENOLIB | 지정한 라이브러리를 찾을 수 없다. |
TDL_TRAN_ERROR | 버전 정합성 처리 중 에러가 발생했다. |
TDL_EINACTIVE | 모듈이 일시적으로 사용 중지된 상태이다. |
최신 버전의 동적 모듈 함수를 호출하는 함수로 함수명을 키로 사용하는 함수이다. 동적 모듈 함수의 프로토 타입이 고정되지 않은 경우에 대해서 파라미터를 그대로 전달하여 함수를 호출한다. 단, 전달되는 인자들은 모두 <void *> 포인터 타입을 가져야 한다. 동적 모듈 함수에서도 전달받는 파라미터가 모두 <void *> 포인터 타입으로 작성되어야 한다.
TDL 환경 파일(tdl.cfg)에 VERSION=1 또는 VERSION=2로 설정된 경우 사용 가능하다.
프로토타입
#include <tdlcall.h> int tdlcallva(char *funcname, long urcode, int flags, int rettype, void *retval, int argc, …);
파라미터
파라미터 | 설명 |
---|---|
funcname | 동적 모듈 함수명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
urcode | 다른 tdlcall() 계열의 함수와 달리 Global Sequence 번호를 전달할 때만 사용한다. 사용하지 않을 경우에는 0을 입력한다. |
flags | TDLTRAN으로 설정이 가능하며 이 경우에 urcode로 반드시 Global Sequence 번호를 전달해야 한다. 사용하지 않을 경우 TDL_NOFLAGS로 설정한다. |
rettype | 호출될 동적 모듈 함수의 리턴 타입을 정의한다. 설정할 수 있는 값은 하단의 리턴 타입 항목을 참조한다. |
retval | 호출된 동적 모듈 함수의 리턴값을 저장할 버퍼의 포인터를 전달한다. |
argc | 호출될 동적 모듈 함수로 전달될 argument의 수를 입력한다. 현재 최대 10개까지 가능하다. |
... | 호출될 동적 모듈 함수로 전달할 실제 파라미터들을 가변인자형으로 입력한다. 반드시 (void *) 포인터 타입의 파라미터를 전달해야 한다. |
리턴 타입 항목
파라미터 | 설명 |
---|---|
TDL_VA_CHAR | 호출될 동적 모듈 함수의 리턴 타입이 char 형이다. |
TDL_VA_SHORT | 호출될 동적 모듈 함수의 리턴 타입이 short 형이다. |
TDL_VA_INT | 호출될 동적 모듈 함수의 리턴 타입이 int 형이다. |
TDL_VA_LONG | 호출될 동적 모듈 함수의 리턴 타입이 long 형이다. |
TDL_VA_FLOAT | 호출될 동적 모듈 함수의 리턴 타입이 float 형이다. |
TDL_VA_DOUBLE | 호출될 동적 모듈 함수의 리턴 타입이 double 형이다. |
TDL_VA_PVOID | 호출될 동적 모듈 함수의 리턴 타입이 void * 형이다. |
TDL_VA_VOID | 호출될 동적 모듈 함수의 리턴 타입이 void 형이다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 성공적으로 종료한 경우이다. |
TDL_OPEN_ERROR | dlopen()을 사용할 때 에러가 발생한 경우이다. |
TDL_SYM_ERROR | dlsym()을 사용할 때 에러가 발생한 경우이다. |
TDL_CLOSE_ERROR | dlclose()를 사용할 때 에러가 발생한 경우이다. |
TDL_SYSTEM_ERROR | 기타 시스템 콜을 사용하다가 에러가 발생한 경우이다. |
TDL_INT _ERROR | 라이브러리 내부에서 오류가 발생한 경우이다. |
TDL_ENOFUNC | 해당 모듈이나 함수를 찾을 수 없다. |
TDL_ENV_ERROR | 환경변수 설정에 오류가 있다. |
TDL_VER_ERROR | TDL 공유 메모리 버전과 환경 파일(tdl.cfg) 버전이 일치하지 않는다. |
TDL_ARG _ERROR | 잘못된 인자가 설정되었다. |
TDL_ENOLIB | 지정한 라이브러리를 찾을 수 없다. |
TDL_TRAN_ERROR | 버전 정합성 처리 중 에러가 발생했다. |
TDL_EINACTIVE | 모듈이 일시적으로 사용 중지된 상태이다. |
예제
동적 모듈 함수
int myfunc(double *a, double *b, double *c) { double sum; return (int)(((double)(*a) + (double)(*b) + (double)(*c))/3); } char * myfunc2(int *type) { char *msg; switch (*type) { case 1: msg = “foo”; break; case 2: msg = “bar”;break; } return msg; }
호출 프로그램
#include <tdlcall.h> int main(int argc, char *argv[]) { int n; long urcode; int retval; double a, b, c; int type; char *retmsg; urcode = tdlgetseqno(); a = 2.5; b = 3.0; c = 3.5; if ((n = tdlcallva2(“mylib001”, “myfunc”, urcode, TDLTRAN, TDL_VA_INT, &retval, 3, &a, &b, &c)) != TDL_OK) { error processing; } type = 1; if ((n = tdlcallva2(“mylib001”, “myfunc2”, urcode, TDLTRAN, TDL_VA_PVOID, &retmsg, 1, &type)) != TDL_OK) { error processing; } }
최신 버전의 동적 모듈 함수를 호출하는 함수로 라이브러리명과 함수명을 키로 사용하는 함수이다. 동적 모듈 함수의 프로토타입이 고정되지 않은 경우에 대해서 파라미터를 그대로 전달하여 함수를 호출한다. 단, 전달되는 인자들은 모두 <void *> 포인터 타입을 가져야 한다. 동적 모듈 함수에서도 전달받는 파라미터가 모두 <void *> 포인터 타입으로 작성되어야 한다.
라이브러리명과 함수명을 키로 사용하는 것을 제외하고는 tdlcallva() 함수와 동일한 기능을 제공한다. TDL 환경 파일(tdl.cfg)에 VERSION=3 으로 설정된 경우 사용 가능하다.
프로토타입
#include <tdlcall.h> int tdlcallva2(char *libname, char *funcname, long urcode, int flags, int rettype, void *retval, int argc, …);
파라미터
파라미터 | 설명 |
---|---|
libname | 동적 모듈 라이브러리명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
funcname | 동적 모듈 함수명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
urcode | 다른 tdlcall() 계열의 함수와 달리 Global Sequence 번호를 전달할 때만 사용한다. 사용하지 않을 경우에는 0을 입력한다. |
flags | TDLTRAN으로 설정이 가능하며 이 경우에 urcode로 반드시 Global Sequence 번호를 전달해야 한다. 사용하지 않을 경우 TDL_NOFLAGS로 설정한다. |
rettype | 호출될 동적 모듈 함수의 리턴 타입을 정의한다. 설정할 수 있는 값은 하단의 리턴 타입 항목을 참조한다. |
retval | 호출된 동적 모듈 함수의 리턴값을 저장할 버퍼의 포인터를 전달한다. |
argc | 호출될 동적 모듈 함수로 전달될 argument의 수를 입력한다. 현재 최대 10개까지 가능하다. |
... | 호출될 동적 모듈 함수로 전달할 실제 파라미터들을 가변인자형으로 입력한다. 반드시 (void *) 포인터 타입의 파라미터를 전달해야 한다. |
리턴 타입 항목
파라미터 | 설명 |
---|---|
TDL_VA_CHAR | 호출될 동적 모듈 함수의 리턴 타입이 char 형이다. |
TDL_VA_SHORT | 호출될 동적 모듈 함수의 리턴 타입이 short 형이다. |
TDL_VA_INT | 호출될 동적 모듈 함수의 리턴 타입이 int 형이다. |
TDL_VA_LONG | 호출될 동적 모듈 함수의 리턴 타입이 long 형이다. |
TDL_VA_FLOAT | 호출될 동적 모듈 함수의 리턴 타입이 float 형이다. |
TDL_VA_DOUBLE | 호출될 동적 모듈 함수의 리턴 타입이 double 형이다. |
TDL_VA_PVOID | 호출될 동적 모듈 함수의 리턴 타입이 void * 형이다. |
TDL_VA_VOID | 호출될 동적 모듈 함수의 리턴 타입이 void 형이다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 성공적으로 종료한 경우이다. |
TDL_OPEN_ERROR | dlopen()을 사용할 때 에러가 발생한 경우이다. |
TDL_SYM_ERROR | dlsym()을 사용할 때 에러가 발생한 경우이다. |
TDL_CLOSE_ERROR | dlclose()를 사용할 때 에러가 발생한 경우이다. |
TDL_SYSTEM_ERROR | 기타 시스템 콜을 사용하다가 에러가 발생한 경우이다. |
TDL_INT _ERROR | 라이브러리 내부에서 오류가 발생한 경우이다. |
TDL_ENOFUNC | 해당 모듈이나 함수를 찾을 수 없다. |
TDL_ENV_ERROR | 환경변수 설정에 오류가 있다. |
TDL_VER_ERROR | TDL 공유 메모리 버전과 환경 파일(tdl.cfg) 버전이 일치하지 않는다. |
TDL_ARG _ERROR | 잘못된 인자가 설정되었다. |
TDL_ENOLIB | 지정한 라이브러리를 찾을 수 없다. |
TDL_TRAN_ERROR | 버전 정합성처리 중 에러가 발생했다. |
TDL_EINACTIVE | 모듈이 일시적으로 사용 중지된 상태이다. |
최신 버전의 동적 모듈에서 Class Factory를 사용하여 클래스 인스턴스를 생성하는 함수로, 라이브러리명과 namespace, 클래스명을 키로 사용하고, TDL 환경 파일(tdl.cfg)에 VERSION=4로 설정되었을 때 사용 가능하다.
동적 모듈에서 Class Factory를 사용하기 위해서는 반드시 long tdlcreate_cb(char *namespace, char *classname, void *args, void *object) 형태의 Callback 함수를 구현해야 한다. Callback 함수에서는 tdlcreate()에서 전달한 파라미터 정보를 이용해서 실제 클래스 인스턴스를 생성하고, 생성된 인스턴스의 레퍼런스를 object로 전달해주도록 사용자가 구현한다.
사용자는 이 함수로 생성한 인스턴스의 사용이 완료되면 반드시 tdldestroy() 함수를 통해서 인스턴스를 파괴해야 한다. tdlcreate()로 생성한 이후 tdldestroy()로 인스턴스를 삭제하기 전에는 tdlupdate가 중간에 호출되어 동적 모듈이 새로운 버전으로 변경되어도 현재 생성되어 사용 중인 인스턴스는 기존의 버전으로 동작한다. 이 경우에는 tdldestroy()를 호출한 뒤에 다시 tdlcreate()를 호출하면 변경된 동적 모듈의 인스턴스가 생성된다.
Class Factory를 사용하기 위해서 동적 모듈은 tdlcreate_cb()와 tdldestroy_cb() Callback 함수를 구현해야 한다.
프로토타입
#include <tdlcall.h> int tdlcreate(char *libname, char *namespace, char *classname, void *args, void *object, long *urcode, int flags)
파라미터
파라미터 | 설명 |
---|---|
libname | 동적 모듈의 라이브러리명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
namespace | namespace를 지정한다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
classname | 인스턴스를 생성할 클래스명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
args | tdlcreate_cb() Callback 함수로 사용자 정의 데이터를 전달할 파라미터이다. |
object | tdlcreate_cb() Callback 함수에서 생성된 클래스 인스턴스의 레퍼런스를 저장할 변수의 포인터이다. 사용자는 함수 호출이 성공하면 object 파라미터를 적절한 타입으로 변환하여 사용한다. |
urcode | tdlcreate_cb() Callback 함수에서 수행된 결과의 반환값이다. |
flags | TDLTRAN으로 설정이 가능하며, 이 경우에 urcode로 반드시 Global Sequence 번호를 전달해야 한다. 사용하지 않을 경우 TDL_NOFLAGS로 설정한다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 성공적으로 종료한 경우이다. |
TDL_OPEN_ERROR | dlopen()을 사용할 때 에러가 발생한 경우이다. |
TDL_SYM_ERROR | dlsym()을 사용할 때 에러가 발생한 경우이다. |
TDL_CLOSE_ERROR | dlclose()를 사용할 때 에러가 발생한 경우이다. |
TDL_SYSTEM_ERROR | 기타 시스템 콜을 사용하다가 에러가 발생한 경우이다. |
TDL_INT _ERROR | 라이브러리 내부에서 오류가 발생한 경우이다. |
TDL_ENOFUNC | 해당 모듈이나 함수를 찾을 수 없다. |
TDL_ENV_ERROR | 환경변수 설정에 오류가 있다. |
TDL_VER_ERROR | TDL 공유 메모리 버전과 환경 파일(tdl.cfg) 버전이 일치하지 않는다. |
TDL_ARG _ERROR | 잘못된 파라미터가 설정되었다. |
TDL_ENOLIB | 지정한 라이브러리를 찾을 수 없다. |
TDL_TRAN_ERROR | 버전 정합성 처리 중 에러가 발생했다. |
TDL_EINACTIVE | 모듈이 일시적으로 사용 중지된 상태이다. |
Callback 함수 프로토타입
long tdlcreate_cb(char *namespace, char *classname, void *args, void *object)
파라미터
파라미터 | 설명 |
---|---|
namespace | tdlcreate() 함수로부터 전달받은 namespace이다. |
classname | tdlcreate() 함수로부터 전달받은 인스턴스를 생성할 클래스명이다 |
args | 사용자 정의 데이터이다. |
object | Callback 함수에서 생성된 클래스 인스턴스의 레퍼런스를 저장할 변수의 포인터이다. |
최신 버전의 동적 모듈에 Class Factory를 사용해서 생성된 클래스 인스턴스를 파괴하는 함수로 라이브러리명과 namespace, 클래스명을 키로 사용하고, TDL 환경 파일(tdl.cfg)에 VERSION=4로 설정되었을 때 사용 가능하다.
동적 모듈에서 Class Factory를 사용하기 위해서는 반드시 long tdldestroy_cb(char *namespace, char *classname, void *args, void *object) 형태의 Callback 함수를 구현해야 한다. Callback 함수에서는 tdldestroy()에서 전달받은 파라미터 정보를 이용해서 클래스 인스턴스를 파괴하도록 사용자가 구현한다.
사용자는 tdlcreate()로 생성한 인스턴스의 사용이 완료되면 반드시 이 함수를 통해서 인스턴스를 파괴해야 한다. tdlcreate()로 생성한 이후 tdldestroy()로 인스턴스를 삭제하기 전에는 tdlupdate가 중간에 호출되어 동적 모듈이 새로운 버전으로 변경되어도 현재 생성되어 사용 중인 인스턴스는 기존의 버전으로 동작한다. 이 경우에는 tdldestroy()를 호출한 뒤에 다시 tdlcreate()를 호출하면 변경된 동적 모듈의 인스턴스가 생성된다.
프로토타입
#include <tdlcall.h> int tdldestroy(char *libname, char *namespcae, char *classname, void *args, void *object, long *urcode, int flags)
파라미터
파라미터 | 설명 |
---|---|
libname | 동적 모듈의 라이브러리명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
namespace | namespace를 지정한다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
classname | 인스턴스를 생성할 클래스명이다. (최대 크기 : TDL_FUNCNAME_SIZE – 1) |
args | tdldestroy_cb() Callback 함수로 사용자 정의 데이터를 전달할 파라미터이다. |
object | 파괴할 클래스 인스턴스의 레퍼런스를 전달한다. tdldestroy_cb() Callback 함수에서 해당 레퍼런스를 파괴한다. 반드시 tdlcreate() 함수로 생성한 object만을 사용해야 한다. |
urcode | tdldestroy_cb() Callback 함수에서 수행된 결과의 반환값이다. |
flags | TDLTRAN으로 설정이 가능하며 이 경우에 urcode로 반드시 Global Sequence 번호를 전달해야 한다. 사용하지 않을 경우 TDL_NOFLAGS로 설정한다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 성공적으로 종료한 경우이다. |
TDL_OPEN_ERROR | dlopen()을 사용할 때 에러가 발생한 경우이다. |
TDL_SYM_ERROR | dlsym()을 사용할 때 에러가 발생한 경우이다. |
TDL_CLOSE_ERROR | dlclose()를 사용할 때 에러가 발생한 경우이다. |
TDL_SYSTEM_ERROR | 기타 시스템 콜을 사용하다가 에러가 발생한 경우이다. |
TDL_INT _ERROR | 라이브러리 내부에서 오류가 발생한 경우이다. |
TDL_ENOFUNC | 해당 모듈이나 함수를 찾을 수 없다. |
TDL_ENV_ERROR | 환경변수 설정에 오류가 있다. |
TDL_VER_ERROR | TDL 공유 메모리 버전과 환경 파일(tdl.cfg) 버전이 일치하지 않는다. |
TDL_ARG _ERROR | 잘못된 파라미터가 설정되었다. |
TDL_ENOLIB | 지정한 라이브러리를 찾을 수 없다. |
TDL_TRAN_ERROR | 버전 정합성 처리 중 에러가 발생했다. |
TDL_EINACTIVE | 모듈이 일시적으로 사용 중지된 상태이다. |
콜백 함수 프로토타입
long tdldestroy_cb(char *namespace, char *classname, void *args, void *object)
파라미터
파라미터 | 설명 |
---|---|
namespace | tdlcreate() 함수로부터 전달받은 namespace이다. |
classname | tdlcreate() 함수로부터 전달받은 인스턴스를 생성할 클래스명이다 |
args | 사용자 정의 데이터이다. |
object | Callback 함수에서 파괴할 클래스 인스턴스의 레퍼런스이다. |
tdlcall()에 대한 에러가 발생했을 때 문자열 형태로 변환하는 함수이다. 직전의 tdlcall() 함수에서 에러가 발생한 경우 에러에 대한 자세한 정보를 문자열 형태로 전달한다. 주의할 점은 반환값으로 전달되는 포인터는 내부의 정적변수에 대한 포인터이므로 다음 tdlcall()을 호출할 경우에 다른 내용으로 채워져 버릴 수 있다는 것이다.
따라서 이 내용을 보관하거나 수정하고 싶으면 다른 변수로 복사를 하여 사용해야 한다.
프로토타입
#include <tdlcall.h> char* tdlerror(int retval)
파라미터
파라미터 | 설명 |
---|---|
retval | 직전 tdlcall() 함수의 반환값이다. |
반환값
반환값 | 설명 |
---|---|
dlopen fail | tdlcall()의 반환값으로 TDL_OPEN_ERROR를 받을 경우이다. |
dlsym fai | tdlcall()의 반환값으로 TDL_SYM_ERROR를 받을 경우이다. |
dlclose fail | tdlcall()의 반환값으로 TDL_CLOSE_ERROR를 받을 경우이다. |
etc system call error | tdlcall()의 반환값으로 TDL_SYSTEM_ERROR를 받을 경우이다. |
TDL lib internal error | tdlcall()의 반환값으로 TDL_INT_ERROR를 받을 경우이다. |
funcname not found | tdlcall()의 반환값으로 TDL_ENOFUNC를 받을 경우이다. |
environment not found | tdlcall()의 반환값으로 TDL_ENV_ERROR를 받을 경우이다. |
shared version mismatch | tdlcall()의 반환값으로 TDL_VER_ERROR를 받을 경우이다. |
invalid arguments | tdlcall()의 반환값으로 TDL_ARG_ERROR를 받을 경우이다. |
library not found | tdlcall()의 반환값으로 TDL_ENOLIB를 받을 경우이다. |
transaction error | tdlcall()의 반환값으로 TDL_TRAN_ERROR를 받을 경우이다. |
inactive funcation | tdlcall()의 반환값으로 TDL_EINACTIVE를 받을 경우이다. |
Global sequence 번호를 가져오는 함수로 이를 반환값으로 반환한다.
프로토타입
#include <tdlcall.h> unsigned int tdlgetseqno(void)
반환값
반환값 | 설명 |
---|---|
0보다 큰 값 | 함수 호출에 성공한 경우이다. |
0 | 함수 호출에 실패한 경우이다. “3.10. tdlerror”로 확인할 수 있다. |
명시적 버전 정합성(Explicit Version Consistency) 유지가 시작된다.
프로토타입
#include <tdlcall.h> int tdlstart(void)
반환값
반환값 | 설명 |
---|---|
TDL_OK | 함수 호출에 성공한 경우이다. |
TDL_TRAN _ERROR | 함수 호출 이전에 tdlstart()가 수행된 경우이다. 자세한 내용은 “3.2. tdlcall”을 참고한다. |
명시적 버전 정합성(Explicit Version Consistency) 유지가 종료된다.
프로토타입
#include <tdlcall.h> int tdlend(void)
반환값
반환값 | 설명 |
---|---|
TDL_OK | 함수가 성공적으로 수행된 경우이다. |
TDL_TRAN _ERROR | 함수 호출 이전에 tdlstart()가 수행된 경우이다. 자세한 내용은 “3.2. tdlcall”을 참고한다. |
일시적으로 버전 정합성 유지를 중지한다. sd(suspend descriptor)를 반환값으로 반환하며, 최대 동시 sd 개수는 8이다.
프로토타입
#include <tdlcall.h> int tdlsuspend(void)
반환값
반환값 | 설명 |
---|---|
0보다 크거나 같은 값 | 함수 호출에 성공한 경우이다. |
TDL_TRAN _ERROR | 현재 버전 정합성 유지 모드가 아닌 경우이다. 자세한 내용은 “3.2. tdlcall”을 참고한다. |
일시적으로 중지된 버전 정합성 유지를 재개하는 함수이다.
프로토타입
#include <tdlcall.h> int tdlresume(int sd)
프로토타입
파라미터 | 설명 |
---|---|
sd | tdlsuspend() 함수에서 전달받은 Descriptor이다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 성공적으로 종료된 경우이다. |
TDL_TRAN _ERROR | sd가 유효한 값이 아닌 경우이다. 자세한 내용은 “3.2. tdlcall”을 참고한다. |
해당 모듈의 레퍼런스 카운트를 0으로 초기화하거나, 모듈을 직접 메모리에서 해제한다.
프로토타입
#include <tdlcall.h> int tdlclose(char *name, int flags)
파라미터
파라미터 | 설명 |
---|---|
name | 해당하는 모듈명이다. |
flags | 0으로 설정할 경우 해당하는 모듈의 레퍼런스 카운트만 0으로 초기화하고, 메모리에서 해제하지 않는다. TDLCLOSE_HARD로 설정할 경우 dlclose하여 해당 모듈을 메모리에서 해제한다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 함수 호출에 성공한 경우이다. |
TDL_ENOLIB | 해당하는 이름의 모듈이 존재하지 않는 경우이다. |
tdlcall()을 통해 특정 모듈을 최초로 호출할 경우, 공유 메모리의 Hashtable 검색 및 라이브러리의 메모리 적재로 인해 약간의 시간이 소모된다. 이로 인해 최초 호출이 약간 지연되는 현상을 막기 위한 방법으로 Hashtable 검색 및 라이브러리 적재를 tdlcall()을 하기 전에 미리 수행하여 로컬 캐시에 해당 모듈의 정보를 저장하는 함수이다.
TDL 환경 파일(tdl.cfg)에 VERSION=1 또는 VERSION=2로 설정된 경우 tdlload()를 사용하고, VERSION=3일 경우에는 tdlload2(), VERSION=4일 경우에는 tdlload3()을 사용한다.
프로토타입
#include <tdlcall.h> int tdlload(char *funcname, int flags)
파라미터
파라미터 | 설명 |
---|---|
funcname | 로드를 수행할 함수명이다. |
flags | 현재 사용하지 않는다. |
반환값
반환값 | 설명 |
---|---|
0 | 함수 호출에 성공한 경우이다. |
TDL_ENOFUNC | 함수 인자로 libname이나 funcname이 NULL이 전달되거나 Hashtable에 존재하지 않는 값을 전달했을 경우이다. |
TDL_OPEN_ERROR | Hashtable에 존재하는 동적 라이브러리(Dynamic Library)를 메모리로 적재하는 것이 실패한 경우이다. |
TDL_SYSTEM_ERROR | 로컬 캐시를 생성하기 위한 시스템 자원 할당이 실패한 경우이다. |
tdlload와 동일하므로 자세한 내용은 “3.17. tdlload”를 참고한다.
프로토타입
#include <tdlcall.h> int tdlload2(char *libname, char *funcname, int flags)
파라미터
파라미터 | 설명 |
---|---|
libname | 로드를 수행할 라이브러리명이다. |
funcname | 로드를 수행할 함수명이다. |
flags | 현재 사용하지 않는다. |
반환값
tdlload와 동일하므로 자세한 내용은 “3.17. tdlload”를 참고한다.
프로토타입
#include <tdlcall.h> int tdlinit(int flags)
파라미터
파라미터 | 설명 |
---|---|
flags | 현재 사용되지 않는다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 함수 호출에 성공한 경우이다. |
0보다 작은 값 | 함수 호출에 실패한 경우이다. “3.10. tdlerror”로 확인할 수 있다. |
프로토타입
#include <tdlcall.h> int tdldone(int flags)
파라미터
파라미터 | 설명 |
---|---|
flags | 현재 사용되지 않는다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 함수 호출에 성공한 경우이다. |
0보다 작은 값 | 함수 호출에 실패한 경우이다. “3.10. tdlerror”로 확인할 수 있다. |
모듈의 인덱스를 찾는 함수이다. TDL 환경 파일(tdl.cfg)에 VERSION=1 또는 VERSION=2로 설정된 경우 사용한다.
프로토타입
#include <tdlcall.h> int tdlfind(char *funcname, int flags)
파라미터
파라미터 | 설명 |
---|---|
funcname | 찾으려는 함수명이다. |
flags | 현재 사용되지 않는다. |
반환값
반환값 | 설명 |
---|---|
0이나 0보다 큰 값 | 함수 호출에 성공한 경우이다. |
0보다 작은 값 | 함수 호출에 실패한 경우이다. “3.10. tdlerror”로 확인할 수 있다. |
모듈의 인덱스를 찾는 함수이다. TDL 환경 파일(tdl.cfg)의 VERSION=3으로 설정된 경우 사용한다.
프로토타입
#include <tdlcall.h> int tdlfind2(char *libname, char *funcname, int flags)
파라미터
파라미터 | 설명 |
---|---|
libname | 찾으려는 라이브러리명이다. |
funcname | 찾으려는 함수명이다. |
flags | 현재 사용되지 않는다. |
반환값
반환값 | 설명 |
---|---|
0이나 0보다 큰 값 | 함수 호출에 성공한 경우이다. |
0보다 작은 값 | 함수 호출에 실패한 경우이다. “3.10. tdlerror”로 확인할 수 있다. |
TDL 환경 파일(tdl.cfg)에 VERSION=1 또는 VERSION=2로 설정된 경우 사용하고, 환경설정에서 MONITOR=Y로 설정해야 한다.
프로토타입
#include <tdlcall.h> int tdlstat(char *funcname, struct timeval svc_time, struct timeval cpu_time)
파라미터
파라미터 | 설명 |
---|---|
funcname | 통계 정보를 수집할 함수명이다. |
svc_time | 통계 정보 중 서비스 타임이 기록되는 변수이다. |
cpu_time | 통계 정보 중 CPU 타임이 기록되는 변수이다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 함수 호출에 성공한 경우이다. |
0보다 작은 값 | 함수 호출에 실패한 경우이다. “3.10. tdlerror”로 확인할 수 있다. |
TDL 환경 파일(tdl.cfg)에 VERSION=3으로 설정된 경우 사용하고, 환경설정에서 MONITOR=Y로 설정해야 한다.
프로토타입
#include <tdlcall.h> int tdlstat2(char *libname, char *funcname, struct timeval svc_time, struct timeval cpu_usrtime, struct timeval cpu_systime)
파라미터
파라미터 | 설명 |
---|---|
libname | 통계 정보를 수집할 라이브러리명이다. |
funcname | 통계 정보를 수집할 함수명이다. |
svc_time | 통계 정보 중 서비스 타임이 기록되는 변수이다. |
cpu_usrtime | 통계 정보 중 유저 CPU 타임이 기록되는 변수이다. |
cpu_systime | 통계 정보 중 시스템 CPU 타임이 기록되는 변수이다. |
반환값
반환값 | 설명 |
---|---|
TDL_OK | 함수 호출에 성공한 경우이다. |
0보다 작은 값 | 함수 호출에 실패한 경우이다. “3.10. tdlerror”로 확인할 수 있다. |