- module ( dinphil) .
- compile ( [ export_all] ) .
college ( ) ->
%%Spawns all the Report, forks and philosophers
Report = spawn ( ?MODULE , report, [ ] ) ,
F1 = spawn ( ?MODULE , initFork, [ "Fork1" , on_table, Report ] ) ,
F2 = spawn ( ?MODULE , initFork, [ "Fork2" , on_table, Report ] ) ,
F3 = spawn ( ?MODULE , initFork, [ "Fork3" , on_table, Report ] ) ,
F4 = spawn ( ?MODULE , initFork, [ "Fork4" , on_table, Report ] ) ,
F5 = spawn ( ?MODULE , initFork, [ "Fork5" , on_table, Report ] ) ,
Philo1 = spawn ( ?MODULE , initPhil, [ "Bob" , F1 , F2 , Report ] ) ,
Philo2 = spawn ( ?MODULE , initPhil, [ "Jim" , F2 , F3 , Report ] ) ,
Philo3 = spawn ( ?MODULE , initPhil, [ "Tim" , F3 , F4 , Report ] ) ,
Philo4 = spawn ( ?MODULE , initPhil, [ "Olly" , F4 , F5 , Report ] ) ,
Philo5 = spawn ( ?MODULE , initPhil, [ "Ted" , F5 , F1 , Report ] ) ,
waitdone ( 5 ) .
report ( ) ->
receive
{ fork, X } ->
{ taken_fork, X } ->
{ thinking, X } ->
{ hungry, X } ->
{ msg, X } ->
Any ->
io :
format ( "XX~s~n" , [ Any ] ) end ,
report ( ) .
initFork ( Name , Isavail , Report ) ->
Report ! { fork
, string :
concat ( Name , ": has been spawned" ) } , fork ( Name , on_table, Report ) .
fork ( Name , on_table, Report ) ->
receive
{ take_left, { Pidphil , Philname } } ->
Pidphil ! { l_fork, self ( ) } ,
Report ! { taken_fork
, string :
concat ( Philname , ": picked up a fork" ) } , Report ! { fork
, string :
concat ( Name , ": Is picked up" ) } , fork ( Name , in_hand, Report ) ;
{ take_right, { Pidphil , Philname } } ->
Pidphil ! { r_fork, self ( ) } ,
Report ! { taken_fork
, string :
concat ( Philname , ": picked up a fork" ) } , Report ! { fork
, string :
concat ( Name , ": Is picked up" ) } , fork ( Name , in_hand, Report )
end ;
fork ( Name , in_hand, Report ) ->
receive
{ put _left, { Pidphil , Philname } } ->
Pidphil ! { l_fork, self ( ) } ,
Report ! { taken_fork
, string :
concat ( Philname , ": put down a fork" ) } , Report ! { fork
, string :
concat ( Name , ": Is put down" ) } , fork ( Name , on_table, Report ) ;
{ put _right, { Pidphil , Philname } } ->
Pidphil ! { r_fork, self ( ) } ,
Report ! { taken_fork
, string :
concat ( Philname , ": put down a fork" ) } , Report ! { fork
, string :
concat ( Name , ": Is put down" ) } , fork ( Name , on_table, Report )
end .
initPhil ( Name , LeftFork , RightFork , Report ) ->
philosopher ( thinking, Name , LeftFork , RightFork , Report ) .
philosopher ( thinking, Name , LFork , RFork , Report ) ->
Report ! { thinking
, string :
concat ( Name , ": thinking" ) } , time r:
sleep ( random :
uniform ( 901 ) + 99 ) , philosopher ( hungry, Name , LFork , RFork , Report ) ;
philosopher ( hungry, Name , LFork , RFork , Report ) ->
Report ! { hungry
, string :
concat ( Name , ": is hungry" ) } , LFork ! { take_left, { self ( ) , Name } } ,
RFork ! { take_right, { self ( ) , Name } } ,
receive
{ l_fork, LFork } -> philosopher ( has_left, Name , LFork , RFork , Report ) ;
{ r_fork, RFork } -> philosopher ( has_right, Name , LFork , RFork , Report )
end ;
philosopher ( has_left, Name , LFork , RFork , Report ) ->
RFork ! { take_right, { self ( ) , Name } } ,
receive
{ r_fork, _ForkPID } -> philosopher ( eating, Name , LFork , RFork , Report )
end ;
philosopher ( has_right, Name , LFork , RFork , Report ) ->
LFork ! { take_left, { self ( ) , Name } } ,
receive
{ l_fork, _ForkPID } -> philosopher ( eating, Name , LFork , RFork , Report )
end ;
philosopher ( eating, Name , LFork , RFork , Report ) ->
Report ! { hungry
, string :
concat ( Name , ": is eating" ) } , time r:
sleep ( random :
uniform ( 901 ) + 99 ) , LFork ! { put _left, { self ( ) , Name } } ,
RFork ! { put _right, { self ( ) , Name } } ,
philosopher ( thinking, Name , LFork , RFork , Report ) .
waitdone ( 0 ) -> finished ;
waitdone ( N ) -> receive finished -> waitdone ( N - 1 ) end .
LW1vZHVsZShkaW5waGlsKS4KLWNvbXBpbGUoW2V4cG9ydF9hbGxdKS4KCmNvbGxlZ2UoKSAtPgoJCSUlU3Bhd25zIGFsbCB0aGUgUmVwb3J0LCBmb3JrcyBhbmQgcGhpbG9zb3BoZXJzCglSZXBvcnQgPSBzcGF3big/TU9EVUxFLCByZXBvcnQsIFtdKSwKCQoJRjEgPSBzcGF3big/TU9EVUxFLCBpbml0Rm9yaywgWyJGb3JrMSIsIG9uX3RhYmxlLCBSZXBvcnRdKSwKCUYyID0gc3Bhd24oP01PRFVMRSwgaW5pdEZvcmssIFsiRm9yazIiLCBvbl90YWJsZSwgUmVwb3J0XSksCglGMyA9IHNwYXduKD9NT0RVTEUsIGluaXRGb3JrLCBbIkZvcmszIiwgb25fdGFibGUsIFJlcG9ydF0pLAoJRjQgPSBzcGF3big/TU9EVUxFLCBpbml0Rm9yaywgWyJGb3JrNCIsIG9uX3RhYmxlLCBSZXBvcnRdKSwKCUY1ID0gc3Bhd24oP01PRFVMRSwgaW5pdEZvcmssIFsiRm9yazUiLCBvbl90YWJsZSwgUmVwb3J0XSksCgkKCVBoaWxvMSA9IHNwYXduKD9NT0RVTEUsIGluaXRQaGlsLCBbIkJvYiIsIEYxLCBGMiwgUmVwb3J0XSksCglQaGlsbzIgPSBzcGF3big/TU9EVUxFLCBpbml0UGhpbCwgWyJKaW0iLCBGMiwgRjMsIFJlcG9ydF0pLAoJUGhpbG8zID0gc3Bhd24oP01PRFVMRSwgaW5pdFBoaWwsIFsiVGltIiwgRjMsIEY0LCBSZXBvcnRdKSwKCVBoaWxvNCA9IHNwYXduKD9NT0RVTEUsIGluaXRQaGlsLCBbIk9sbHkiLCBGNCwgRjUsIFJlcG9ydF0pLAoJUGhpbG81ID0gc3Bhd24oP01PRFVMRSwgaW5pdFBoaWwsIFsiVGVkIiwgRjUsIEYxLCBSZXBvcnRdKSwKCXdhaXRkb25lKDUpLgoKcmVwb3J0KCkgLT4KCXJlY2VpdmUKCQl7Zm9yaywgWH0gLT4KCQkJaW86Zm9ybWF0ICgifnN+biIsIFtYXSk7CgkJe3Rha2VuX2ZvcmssIFh9IC0+CgkJCWlvOmZvcm1hdCAoIn5zfm4iLCBbWF0pOwoJCXt0aGlua2luZywgWH0gLT4KCQkJaW86Zm9ybWF0ICgifnN+biIsIFtYXSk7CgkJe2h1bmdyeSwgWH0gLT4KCQkJaW86Zm9ybWF0ICgifnN+biIsIFtYXSk7CgkJe21zZywgWH0gLT4KCQkJaW86Zm9ybWF0ICgifnN+biIsIFtYXSk7CgkJQW55IC0+CgkJCWlvOmZvcm1hdCAoIlhYfnN+biIsIFtBbnldKQoJZW5kLAoJCXJlcG9ydCgpLgoJCmluaXRGb3JrKE5hbWUsIElzYXZhaWwsIFJlcG9ydCkgLT4KCVJlcG9ydCAhIHtmb3JrLCBzdHJpbmc6Y29uY2F0KE5hbWUsICI6IGhhcyBiZWVuIHNwYXduZWQiKX0sCglmb3JrKE5hbWUsIG9uX3RhYmxlLCBSZXBvcnQpLgoKZm9yayhOYW1lLCBvbl90YWJsZSwgUmVwb3J0KSAtPgoJcmVjZWl2ZQoJCXt0YWtlX2xlZnQsIHtQaWRwaGlsLCBQaGlsbmFtZX19IC0+CgkJCVBpZHBoaWwgISB7bF9mb3JrLCBzZWxmKCl9LAoJCQlSZXBvcnQgISB7dGFrZW5fZm9yaywgc3RyaW5nOmNvbmNhdChQaGlsbmFtZSwgIjogcGlja2VkIHVwIGEgZm9yayIpfSwKCQkJUmVwb3J0ICEge2ZvcmssIHN0cmluZzpjb25jYXQoTmFtZSwgIjogSXMgcGlja2VkIHVwIil9LAoJCQlmb3JrKE5hbWUsIGluX2hhbmQsIFJlcG9ydCk7CgkJCQoJCXt0YWtlX3JpZ2h0LCB7UGlkcGhpbCwgUGhpbG5hbWV9fSAtPiAKCQkJUGlkcGhpbCAhIHtyX2ZvcmssIHNlbGYoKX0sCQoJCQlSZXBvcnQgISB7dGFrZW5fZm9yaywgc3RyaW5nOmNvbmNhdChQaGlsbmFtZSwgIjogcGlja2VkIHVwIGEgZm9yayIpfSwKCQkJUmVwb3J0ICEge2ZvcmssIHN0cmluZzpjb25jYXQoTmFtZSwgIjogSXMgcGlja2VkIHVwIil9LAoJCQlmb3JrKE5hbWUsIGluX2hhbmQsIFJlcG9ydCkKCWVuZDsKCQpmb3JrKE5hbWUsIGluX2hhbmQsIFJlcG9ydCkgLT4KCXJlY2VpdmUKCQl7cHV0X2xlZnQsIHtQaWRwaGlsLCBQaGlsbmFtZX19IC0+CgkJCVBpZHBoaWwgISB7bF9mb3JrLCBzZWxmKCl9LAoJCQlSZXBvcnQgISB7dGFrZW5fZm9yaywgc3RyaW5nOmNvbmNhdChQaGlsbmFtZSwgIjogcHV0IGRvd24gYSBmb3JrIil9LAoJCQlSZXBvcnQgISB7Zm9yaywgc3RyaW5nOmNvbmNhdChOYW1lLCAiOiBJcyBwdXQgZG93biIpfSwKCQkJZm9yayhOYW1lLCBvbl90YWJsZSwgUmVwb3J0KTsKCQkJCgkJe3B1dF9yaWdodCwge1BpZHBoaWwsIFBoaWxuYW1lfX0gLT4KCQkJUGlkcGhpbCAhIHtyX2ZvcmssIHNlbGYoKX0sCgkJCVJlcG9ydCAhIHt0YWtlbl9mb3JrLCBzdHJpbmc6Y29uY2F0KFBoaWxuYW1lLCAiOiBwdXQgZG93biBhIGZvcmsiKX0sCgkJCVJlcG9ydCAhIHtmb3JrLCBzdHJpbmc6Y29uY2F0KE5hbWUsICI6IElzIHB1dCBkb3duIil9LAoJCQlmb3JrKE5hbWUsIG9uX3RhYmxlLCBSZXBvcnQpCgkJZW5kLgoJCmluaXRQaGlsKE5hbWUsIExlZnRGb3JrLCBSaWdodEZvcmssIFJlcG9ydCkgLT4KCQlTZWVkID0gcmFuZG9tOnNlZWQobm93KCkpLAoJCXBoaWxvc29waGVyKHRoaW5raW5nLCBOYW1lLCBMZWZ0Rm9yaywgUmlnaHRGb3JrLCBSZXBvcnQpLgoKcGhpbG9zb3BoZXIodGhpbmtpbmcsIE5hbWUsIExGb3JrLCBSRm9yaywgUmVwb3J0KSAtPgoJUmVwb3J0ICEge3RoaW5raW5nLCBzdHJpbmc6Y29uY2F0KE5hbWUsICI6IHRoaW5raW5nIil9LAoJdGltZXI6c2xlZXAocmFuZG9tOnVuaWZvcm0oOTAxKSs5OSksCglwaGlsb3NvcGhlcihodW5ncnksIE5hbWUsIExGb3JrLCBSRm9yaywgUmVwb3J0KTsKCQpwaGlsb3NvcGhlcihodW5ncnksIE5hbWUsIExGb3JrLCBSRm9yaywgUmVwb3J0KSAtPgoJUmVwb3J0ICEge2h1bmdyeSwgc3RyaW5nOmNvbmNhdChOYW1lLCAiOiBpcyBodW5ncnkiKX0sCglMRm9yayAhIHt0YWtlX2xlZnQsIHtzZWxmKCksIE5hbWV9fSwKCVJGb3JrICEge3Rha2VfcmlnaHQsIHtzZWxmKCksIE5hbWV9fSwKCXJlY2VpdmUgCgl7bF9mb3JrLCBMRm9ya30gLT4gcGhpbG9zb3BoZXIoaGFzX2xlZnQsIE5hbWUsIExGb3JrLCBSRm9yaywgUmVwb3J0KTsKCXtyX2ZvcmssIFJGb3JrfSAtPiBwaGlsb3NvcGhlcihoYXNfcmlnaHQsIE5hbWUsIExGb3JrLCBSRm9yaywgUmVwb3J0KQoJZW5kOwoJCnBoaWxvc29waGVyKGhhc19sZWZ0LCBOYW1lLCBMRm9yaywgUkZvcmssIFJlcG9ydCkgLT4KCVJGb3JrICEge3Rha2VfcmlnaHQsIHtzZWxmKCksIE5hbWV9fSwKCXJlY2VpdmUKCQl7cl9mb3JrLCBfRm9ya1BJRH0gLT4gcGhpbG9zb3BoZXIoZWF0aW5nLCBOYW1lLCBMRm9yaywgUkZvcmssIFJlcG9ydCkKCWVuZDsKCQpwaGlsb3NvcGhlcihoYXNfcmlnaHQsIE5hbWUsIExGb3JrLCBSRm9yaywgUmVwb3J0KSAtPgoJTEZvcmsgISB7dGFrZV9sZWZ0LCB7c2VsZigpLCBOYW1lfX0sCgkKCXJlY2VpdmUKCQl7bF9mb3JrLCBfRm9ya1BJRH0gLT4gcGhpbG9zb3BoZXIoZWF0aW5nLCBOYW1lLCBMRm9yaywgUkZvcmssIFJlcG9ydCkKCWVuZDsKCnBoaWxvc29waGVyKGVhdGluZywgTmFtZSwgTEZvcmssIFJGb3JrLCBSZXBvcnQpIC0+CglSZXBvcnQgISB7aHVuZ3J5LCBzdHJpbmc6Y29uY2F0KE5hbWUsICI6IGlzIGVhdGluZyIpfSwKCXRpbWVyOnNsZWVwKHJhbmRvbTp1bmlmb3JtKDkwMSkrOTkpLAoJTEZvcmsgISB7cHV0X2xlZnQsIHtzZWxmKCksIE5hbWV9fSwKCVJGb3JrICEge3B1dF9yaWdodCwge3NlbGYoKSwgTmFtZX19LAoJcGhpbG9zb3BoZXIodGhpbmtpbmcsIE5hbWUsIExGb3JrLCBSRm9yaywgUmVwb3J0KS4KCQp3YWl0ZG9uZSAoMCkgLT4gZmluaXNoZWQgOwp3YWl0ZG9uZSAoTikgLT4gcmVjZWl2ZSBmaW5pc2hlZCAtPiB3YWl0ZG9uZSAoTiAtMSkgZW5kLgoKCgoJCgk=