Giving orders from a core loop

Hey All -

I’m creating a core server loop for my MUD that will command various modules of the game (each presumably running on their own thread) to refresh themselves. For example, the core loop would contact an actionsStack module and tell it to process a certain number of actions, contact a mobList module and tell it to command each mob to tick (retrieve actions, check if spell durations are up, lose health if bleeding, etc.), perhaps check on a newPlayerConnections module, maybe sleep, and then start all over.

My intention behind encapsulating all of the above functionality into various modules is that the core loop need not hang on any particular resource-intensive process, thereby delaying other processes.

A) Is this a reasonable solution to the problem?

B) If so, what is the best way to code a ‘refresh’ order from the core thread to secondary module threads? My first thought is to create a volatile boolean named refreshed, and have it set to false by the core thread. And the secondary thread would just loop while(!refreshed) { doStuff; }

Cheers.

I’m not an expert on Threads, but in my opinion the less you have the better (maybe that’s why I’m not an expert on them). While it is absolutely a good idea to try to keep the core loop from hanging, I don’t necessarily see the point in it because if one process is taking a long time won’t you have a lot of bad synchronization issues if you don’t wait for it? I also would not at all recommend just a while loop. That will jack up processor use to 100% whether it is needed or not. I would just use Thread.yield() on all Threads that should be waiting. Actually I guess if you just put Thread.yield() inside your while loop it should probably fix your problem.

I think you’re right, actually. Often times I find myself operating under the notion that giving two different modules two different call stacks, that they receive more attention than they would in a single call stack. In other words, that the two stacks are truly operating simultaneous to one another. The reality is, I think, that I’m just introducing synchronicity issues.

Okay, here’s what I have for a core loop at the moment. If anyone can think of other generic MUD server functions (outside of specific architectural solutions) please let me know. Any and all feedback very much welcome.

Core Loop*
Check for incoming network connections
Monitor existing connections (Manage disconnect… hrmm should input be sent to players here? Or at end of loop?)
Player refresh (get input, create actions, update status)
MonsterBehavior (create actions, update status)
ProcessActions (Game logic to create event objects of some sort)
Publish narratives(send input to players)

*Each line represents a class or group of classes

That seems right. The one MUD I messed around with was written in PHP and MySQL, so basically all I needed to do was have each page pull from the current MySQL data, and adjust the data when someone did something. This could be sort of weird, especially with people who had varying connection speeds, but it worked on a simplistic level. What you have should work a lot nicer due to every request and action going through one place.