/*  -
   Copyright (C) 2006 Weongyo Jeong (weongyo@gmail.com)

This file is part of ROVM.

ROVM is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.

ROVM is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

#ifndef _ROVM_TICKET_H
#define _ROVM_TICKET_H

#include "core.h"

/**
   기본적으로 생성할 스택 slot 의 갯수.
 */
#define DEFAULT_STACK_SLOT              256

#define TICKET_TIME(NODE)		((NODE)->tmade)

#define TICKET_SP(NODE)                 ((NODE)->sp)
#define TICKET_LOCAL(NODE)              ((NODE)->local)
#define TICKET_RET(NODE)                (&((NODE)->ret))

#define TICKET_STACK(NODE)              ((NODE)->stack)
#define TICKET_STACK_IDX(NODE, IDX)     ((NODE)->stack[(IDX)])
#define TICKET_MAX_STACK(NODE)          ((NODE)->max_stack)

/**
   사용자의 request 가 온 후, 생성되는 구조체로써, 사용자가 보낸 여러 정보들의
   상태등을 담고 있으며, 이를 이용하여 다음 요청이 왔을 때에도 계속 사용할 수
   있도록 한다.

   이 구조체는 대단히 중요한 구조체로써 각 request 에 대한 현재 모든 상태들을
   가지고 있다.
 */
struct ticket
{
  /**
     Ticket 이 생성된 시각을 가지고 있다.  이것은 나중에 일정 시간이 경과한
     ticket 의 경우, 자동 소멸을 위해서 사용된다.
  */
  rc_time_t tmade;

  /** Stack Pointer.  x86 에서 stack pointer 개념이랑 같습니다.  */
  rovm_stack_t *sp;
  /** Local Variable Pointer.  이것은 자바 가상 머신에서의 개념과 거의 같으며
      아래 변수 `stack' 배열중 하나의 slot 을 가르키게 된다.  이에 대한 자세한
      개념은 `Stack 과 Local 변수의 이해' 글을 참고하기 바란다.

      @note 현재 `Stack 과 Local 변수의 이해' 글은 존재하지 않는다.  */
  rovm_stack_t *local;

  /** Ticket 이 관리하는 스택 slot 들.  스택 배열입니다. */
  rovm_stack_t *stack;
  /** 위 변수 `stack' 에 할당된 스택 slot 의 갯수.  */
  int max_stack;

  /** 현재 ticket operation 이 처리되면서 반환하게 되는 return 값이 설정되는
      위치.  */
  rovm_stack_t ret;
};

extern char *create_ticketid (request_rec *);
extern int gen_unique_ticketid (char *);
extern int register_ticketid (request_rec *, char *);
extern struct ticket *lookup_ticket (request_rec *, char *);
extern int ticket_pre_config ( struct ticket *);
extern void destroy_ticket (struct ticket *);
extern int destroy_tickets (request_rec *, char *);

#endif
