/*
 * Criação de uma nova thread, com passagem de dados.
 *
 */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

/* Parâmetros para a função */
typedef struct {
  int x;
  int y;
} Argumentos;

/* Retorno da função */
typedef struct {
  int w;
  int z;
} Retorno;

Retorno* f (Argumentos* p_arg) {
  Retorno *ret = 
    (Retorno*) malloc (sizeof(Retorno));
  ret->w = p_arg->x + 1;
  ret->z = p_arg->y + 1;
  return ret;
}


void* f_thread(void *v) {
  Argumentos *p_arg = (Argumentos*) v; 
  return (void*) f(p_arg);
}

int main() {
  pthread_t thr;
  Argumentos arg;
  Retorno *ap_ret;

  /* Prepara os argumentos para envio */
  arg.x = 0;
  arg.y = 1;

  pthread_create(&thr, NULL, f_thread, (void*) &arg);
  
  pthread_join(thr, (void**) &ap_ret);

  printf("Valor de retorno (apontador): %p\n", ap_ret);
  printf("Valor de retorno (conteúdo): w = %d z = %d\n", 
	 ap_ret->w, ap_ret->z);
  
  free(ap_ret); 
  
  return 0;
}