본문 바로가기

Programing/Node.js

libuv가 많이 바뀌었다.

객체지향에서 인터페이스 부분(public 필드나 메서드)은 바뀌면 사용하는 부분도 수정을 해주어야 한다.

C의 경우에는 함수의 프로토타입이 그런 영역이 될 것이다.


libuv에 대한 메뉴얼이 별도로 없어서 An Introduction to libuv와 libuv 소스코드를 참고해서 짜다보니 현재 버전과 많이 다르다는 것을 느끼고 있다. 이 메뉴얼은 0.10.2 기준으로 되어 있고 나는 0.11.24 버전이다 (uv-version.h에 적혀있다)


uv_last_error

Win32의 GetLastError()와 유사하다.

이 함수는 함수 모양이 바뀐 것이 아니라 아예 없어졌다.

예제를 보면 uv_err_name(uv_last_error(loop)) 식으로 사용을 한다. 참고로 loop는 uv_loop_t 포인터 타입이다.


이것 관련해서는 2013년 7월 7일 개정판에 나와 있다.(Link)

loop 전역변수에 에러코드에 저장해서 사용하는 것보다 libuv API에 에러코드를 직접 넘겨주는 것으로 바뀌었다는 것이다.

따라서 아래 같은 코드는:

    if (uv_foo(loop) < 0) {
      uv_err_t err = uv_last_error(loop);
      fprintf(stderr, "%s\n", uv_strerror(err));
    }

다음과 같이 바뀌어야 한다고 한다.

    int err = uv_foo(loop);
    if (err < 0)
      fprintf(stderr, "%s\n", uv_strerror(err));

아마도 이유는 전역 변수에 에러코드를 넣다보면, 동시 접근이 가능한 애플리케이션에서는 액션이 수시로 이루어지기 때문에 값이 덮어씌워질 문제가 있기 때문을 것으로 생각한다. 윈도우 API에서도 에러가 발생하고 GetLastError함수를 바로 호출을 해야지 되는데, 다른 윈도우 API 함수를 호출하면 값이 덮어씌워져 버릴 수 있기 때문이다.


추가적으로 int status를 인자로 받는 함수들은 이 값이 0보다 작을 경우 uv_strerror를 통해 어떤 에러인지 문자로 확인할 수 있다.

// uv_connection_cb 함수 포인터. 선언은 바로 아래 라인과 같다.

// typedef void (*uv_connection_cb)(uv_stream_t* server, int status);

//

void on_new_connection(uv_stream_t* server, int status)

{

printf("on_new_connection\n");


if (status < 0) // 이전에는 status == -1 과 같이 비교를 했을 것이다.

{

fprintf(stderr, "on_new_connection error: %s\n", uv_err_name(status));

return;

}

...


'Programing > Node.js' 카테고리의 다른 글

libuv - uv_pipe_open 에러 : EINVAL  (1) 2014.04.15
libuv 계층도  (0) 2014.04.15
An Introduction to libuv  (0) 2014.04.01
libuv  (0) 2014.04.01
Node.js winston 표준 시간이 안맞는 경우 해결 방법  (0) 2014.03.20