/* Generated by Frama-C */
typedef void *framac_mthread_name;
typedef int framac_mthread_id;
typedef framac_mthread_id pthread_t;
typedef framac_mthread_id pthread_attr_t;
typedef framac_mthread_id pthread_mutex_t;
typedef framac_mthread_id pthread_mutexattr_t;
extern int __FRAMAC_MTHREAD_SHARED;
int __FRAMAC_MTHREAD_THREADS_RUNNING = 0;
int __FRAMAC_MTHREAD_THREADS[16];
int __FRAMAC_MTHREAD_MUTEXES[16];
int __FRAMAC_MTHREAD_QUEUES[16];
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern framac_mthread_id __FRAMAC_THREAD_CREATE(framac_mthread_name,
                                                void *(*)(void *) , ...);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern int __FRAMAC_THREAD_START(framac_mthread_id);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern int __FRAMAC_THREAD_SUSPEND(framac_mthread_id);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern int __FRAMAC_THREAD_CANCEL(framac_mthread_id);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern framac_mthread_id __FRAMAC_THREAD_ID();
/*@ terminates \false;
    ensures \false;
    assigns __FRAMAC_MTHREAD_SHARED;  */
extern void __FRAMAC_THREAD_EXIT(void *);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern framac_mthread_id __FRAMAC_MUTEX_INIT(framac_mthread_name);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern int __FRAMAC_MUTEX_LOCK(framac_mthread_id);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern int __FRAMAC_MUTEX_UNLOCK(framac_mthread_id);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern framac_mthread_id __FRAMAC_QUEUE_INIT(framac_mthread_name, int);
/*@ requires \valid(buf+(0..size-1));
    assigns __FRAMAC_MTHREAD_SHARED;  */
extern int __FRAMAC_MESSAGE_SEND(framac_mthread_id id, char const *buf,
                                 int size);
/*@ requires \valid(buf+(0..size-1));
    assigns *buf, __FRAMAC_MTHREAD_SHARED;
    assigns *buf \from \empty;
  
*/
extern int __FRAMAC_MESSAGE_RECEIVE(framac_mthread_id, int size, char *buf);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern void __FRAMAC_MTHREAD_SHOW(char const * , ...);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern void __FRAMAC_MTHREAD_NAME_THREAD(framac_mthread_id,
                                         framac_mthread_name);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern void __FRAMAC_MTHREAD_NAME_MUTEX(framac_mthread_id,
                                        framac_mthread_name);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern void __FRAMAC_MTHREAD_NAME_QUEUE(framac_mthread_id,
                                        framac_mthread_name);
/*@ assigns __FRAMAC_MTHREAD_SHARED;  */
extern void __FRAMAC_MTHREAD_SYNC();
int u1 = 0;
int u2 = 0;
int u3 = 0;
int s4 = 0;
int s5 = 0;
int s6 = 0;
pthread_t jobs1;
pthread_t jobs2;
pthread_t jobs3;
pthread_t jobs31;
pthread_t jobs4;
pthread_t jobs5;
pthread_t jobs51;
pthread_t jobs6;
void f1(void *)
{
  int t;
  t = u1;
  u1 ++;
  return;
}

void f2(void *)
{
  return;
}

void f31(int x)
{
  int t;
  t = u3;
  u3 = 31;
  return;
}

void f3(void *)
{
  u3 = 3;
  pthread_create(& jobs31,(pthread_attr_t const *)((void *)0),
                 (void *(*)(void *))(& f31),(void *)0);
  return;
}

void f4(void *)
{
  int t;
  t = s4;
  s4 = 4;
  t = s6;
  s6 = 4;
  return;
}

void f51(int x)
{
  int t;
  t = s5;
  s5 = 51;
  return;
}

void f5(void *)
{
  pthread_create(& jobs51,(pthread_attr_t const *)((void *)0),
                 (void *(*)(void *))(& f51),(void *)0);
  s5 = 5;
  return;
}

void f6(void *)
{
  int t;
  t = s6;
  s6 = 6;
  return;
}

void main(void)
{
  int t;
  u1 = 1;
  t = u1;
  u2 = 1;
  u3 = 1;
  pthread_create(& jobs1,(pthread_attr_t const *)((void *)0),
                 (void *(*)(void *))(& f1),(void *)0);
  u2 = 1;
  t = u2;
  pthread_create(& jobs2,(pthread_attr_t const *)((void *)0),
                 (void *(*)(void *))(& f2),(void *)0);
  pthread_create(& jobs3,(pthread_attr_t const *)((void *)0),
                 (void *(*)(void *))(& f3),(void *)0);
  s4 = -1;
  s6 = 2;
  pthread_create(& jobs4,(pthread_attr_t const *)((void *)0),
                 (void *(*)(void *))(& f4),(void *)0);
  s4 = 1;
  pthread_create(& jobs5,(pthread_attr_t const *)((void *)0),
                 (void *(*)(void *))(& f5),(void *)0);
  pthread_create(& jobs6,(pthread_attr_t const *)((void *)0),
                 (void *(*)(void *))(& f6),(void *)0);
  return;
}

int pthread_create(pthread_t *thread, pthread_attr_t const *attr,
                   void *(*start_routine)(void *), void *arg)
{
  int __retres;
  int result;
  result = __FRAMAC_THREAD_CREATE((void *)thread,start_routine,arg);
  if (result > 0) {
    *thread = result;
    __FRAMAC_THREAD_START(result);
    __retres = 0;
    goto return_label;
  }
  else {
    __retres = 11;
    goto return_label; }
  return_label: /* internal */ 
  return (__retres);
}

int pthread_cancel(pthread_t thread)
{
  int result;
  int tmp_0;
  result = __FRAMAC_THREAD_CANCEL(thread);
  if (result != -1) { tmp_0 = 0; }
  else { tmp_0 = 3; }
  return (tmp_0);
}

pthread_t pthread_self(void)
{
  pthread_t tmp;
  tmp = __FRAMAC_THREAD_ID();
  return (tmp);
}

int pthread_mutex_init(pthread_mutex_t * __restrict mutex,
                       pthread_mutexattr_t const * __restrict attr)
{
  int __retres;
  int result;
  result = __FRAMAC_MUTEX_INIT((void *)mutex);
  if (result > 0) {
    *mutex = result;
    __retres = 0;
    goto return_label; }
  else {
    __retres = 22;
    goto return_label; }
  return_label: /* internal */ 
  return (__retres);
}

int pthread_mutex_lock(pthread_mutex_t *mutex)
{
  int result;
  int tmp_0;
  result = __FRAMAC_MUTEX_LOCK(*mutex);
  if (result != -1) { tmp_0 = 0; }
  else { tmp_0 = 22; }
  return (tmp_0);
}

int pthread_mutex_trylock(pthread_mutex_t *mutex)
{
  int result;
  int tmp_0;
  result = __FRAMAC_MUTEX_LOCK(*mutex);
  if (result != -1) { tmp_0 = 0; }
  else { tmp_0 = 22; }
  return (tmp_0);
}

int pthread_mutex_unlock(pthread_mutex_t *mutex)
{
  int result;
  int tmp_0;
  result = __FRAMAC_MUTEX_UNLOCK(*mutex);
  if (result != -1) { tmp_0 = 0; }
  else { tmp_0 = 22; }
  return (tmp_0);
}

void pthread_exit(void *thread_return)
{
  __FRAMAC_THREAD_EXIT(thread_return);
  return;
}

int volatile NON_DET_JOIN;
int pthread_join(pthread_t thread, void **thread_return)
{
  int tmp;
  *thread_return = (void *)NON_DET_JOIN;
  if (NON_DET_JOIN) { tmp = -1; }
  else { tmp = 0; }
  return (tmp);
}

int pthread_setcancelstate(int state, int *oldstate)
{
  int __retres;
  __retres = 0;
  return (__retres);
}

int pthread_setcanceltype(int type, int *oldtype)
{
  int __retres;
  __retres = 0;
  return (__retres);
}

void pthread_testcancel(void)
{
  return;
}

int queuecreate(framac_mthread_name *q, int size)
{
  int __retres;
  *((int *)q) = __FRAMAC_QUEUE_INIT((void *)q,size);
  __retres = 0;
  return (__retres);
}

int msgsnd(int msgqid, char const *mess, int size)
{
  int result;
  result = __FRAMAC_MESSAGE_SEND(msgqid,mess,size);
  return (result);
}

int msgrcv(int msgqid, int size, char *mess)
{
  int tmp;
  tmp = __FRAMAC_MESSAGE_RECEIVE(msgqid,size,mess);
  return (tmp);
}