view dpp2.cbc @ 2:b15128ab0324

Fix dpp2 for cbc using LLVM 3.7
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Wed, 16 Dec 2015 17:16:29 +0900
parents d4bc23cb728b
children 4a68716b7488
line wrap: on
line source

/*
** Program: Dining Philosophors Problem
** Author : Atsuki Shimoji
*/

#include "dpp2.h"
#include "queue.h"
#include "scheduler.h"

__code putdown_lfork(PhilsPtr self, TaskPtr current_task)
{
	//printf("%d: putdown_lfork:%d\n", self->id, self->left_fork->id);
	self->left_fork->owner = NULL;
	self->next = thinking;
	goto scheduler(self, current_task);
}

__code putdown_rfork(PhilsPtr self, TaskPtr current_task)
{
	//printf("%d: putdown_rfork:%d\n", self->id, self->right_fork->id);
	self->right_fork->owner = NULL;
	self->next = putdown_lfork;
	goto scheduler(self, current_task);
}

__code eating(PhilsPtr self, TaskPtr current_task)
{
	//printf("%d: eating\n", self->id);
	self->next = putdown_rfork;
	goto scheduler(self, current_task);
}

/* waiting for right fork */
__code hungry2(PhilsPtr self, TaskPtr current_task)
{
	//printf("%d: hungry2\n", self->id);
	self->next = pickup_rfork;
	goto scheduler(self, current_task);
}

/* waiting for left fork */
__code hungry1(PhilsPtr self, TaskPtr current_task)
{
	//printf("%d: hungry1\n", self->id);
	self->next = pickup_lfork;
	goto scheduler(self, current_task);
}

__code pickup_rfork(PhilsPtr self, TaskPtr current_task)
{
	if (self->right_fork->owner == NULL) {
		//printf("%d: pickup_rfork:%d\n", self->id, self->right_fork->id);
		self->right_fork->owner = self;
		self->next = eating;
		goto scheduler(self, current_task);
	} else {
		self->next = hungry2;
		goto scheduler(self, current_task);
	}
}

__code pickup_lfork(PhilsPtr self, TaskPtr current_task)
{
	if (self->left_fork->owner == NULL) {
		//printf("%d: pickup_lfork:%d\n", self->id, self->left_fork->id);
		self->left_fork->owner = self;
		self->next = pickup_rfork;
		goto scheduler(self, current_task);
	} else {
		self->next = hungry1;
		goto scheduler(self, current_task);
	}
}

__code thinking(PhilsPtr self, TaskPtr current_task)
{
	//printf("%d: thinking\n", self->id);
	self->next = hungry1;
	goto scheduler(self, current_task);
}

/* end */