본문 바로가기

프로그래밍/API

(remote) function dispatch~

전에 관련 글을 쓰고 나서 오랜만에 그에 대한 글을 추가합니다.
이제 테스트를 마쳤습니다~ 간단한 자료형(point가 포함되지 않은)인 경우가 아닌, point 가 포함된 데이터를
넘겨서 처리하게 하려고 하니 파생적으로 여러가지 모듈이 추가로 개발되었네요..

이제 IDL로 이러한 루틴을 Simple하게 만들 방법을 궁리해 봐야겠습니다~

struct sub_arg {
 int a;
 char *b;
};

// 실행할 함수
int invoke_test( struct stat *fs, char *name, struct sub_arg *sub)
{
 fprintf( stderr, " invoke: '%s'\n", name);
 fprintf( stderr, "\t fs.st_size: %ld\n", fs->st_size);
 fprintf( stderr, "\t sub: %d, '%s'\n", sub->a, sub->b);
 return 0;
}


#include "debug.h"
#include "args.h"

int main( int argc, char *argv[])
{
 char arg_buffer[1024];
 char sub_buffer[1024];
 struct stat fs;

 if (lstat( argv[0], &fs) < 0)
  return 0;
 else {
  struct sub_arg s_arg = { 10, "sample" };
  arg_lnBuffer arg;
  int r;

  // argument 직렬화
  arg_start( &arg, arg_buffer, 512);
  arg_put( &arg, (void *)&fs, sizeof(fs));
  arg_put( &arg, (void *)argv[0], strlen(argv[0]) + 1);
  char *begin =  (char *)arg_put( &arg, (void *)&s_arg, sizeof(struct sub_arg));
  arg_offsetof( &arg, begin + offsetof( struct sub_arg, b),  (void *)"sample", strlen("sample") + 1);

  int size;
  char *result = arg_store( &arg, &size); // result는 네트워크로 전송 가능한 데이터
  dumpBuffer( result, size);

  // 이하 remote 처리 부분
 
uco_Args u_args = { NULL, size };

 
memcpy( sub_buffer, result, size);
  // 받은 데이터를 로컬메모리로 복구
  u_args.buffer = arg_restore( sub_buffer, &u_args.size); // 내부 메모리로 데이터 맵핑~
  fprintf( stderr, " restore: %d bytes\n", u_args.size);
  dumpBuffer( sub_buffer, size);
  fprintf( stderr, " memcmp = %d\n", memcmp( result, sub_buffer, size));
  memset( arg_buffer, 0, sizeof(arg_buffer));

  // 함수 호출
  uco_invoke( 0, (void *)invoke_test, (uco_Args *)&u_args, &r, TYPE_INT64);
  fprintf( stderr, " uco_invoke: %d\n", r); // 반환값
 } return 0;
}


은, linux로 포팅된 소스입니다.. 전에 관련 루틴을 윈도우와 리눅스 모두 테스트 하였습니다.

단순 자료형(point가 없는)에서는 소스도 simple해 질수 있는데, point 데이터를 remote로 가져가서
처리할수 있게 하려니 소스가 쬐금 복잡해 졌네요.. 제가 IDL을 찾는 이유중에 하나가 이놈들 때문입니다~