[crossfire] Moving server towards a modularized system?

Yann Chachkoff yann.chachkoff at myrealbox.com
Tue Jan 17 02:49:07 CST 2006


Le Mardi 17 Janvier 2006 06:03, Alex Schultz a écrit :
> Frankly, I have to agree with mikee to some degree on this point. I
> generally have little trouble finding something after a combination of
> getting a feel for the code, which I have gotten pretty good for a while
> now, as well as skilled grepping.
>
"Finding something" is not really that difficult. However, adding new things 
often is, because it is not uncommon to have to modify the code at several 
different places. I see this as inherently bad - if I want to implement a new 
object type for example, I'd prefer putting its whole code in a single place 
than having to edit several source files (some being in common/, others being 
in server/). 

Of course, a skilled coder that has got a good knowledge of the Crossfire code 
generally has little difficulty to find its way through the code - but not 
every contributor can/wants to afford the time required to get that in-depth 
knowledge of the code; besides that, having to play with grep to find the 
relevant piece of code is already a failure in itself, IMHO: if even somebody 
used to the source has to rely on a search engine to find its way through it, 
can we consider there is no problem ?

> However aside from some things like this, I do find modularization can
> have merits, it just depends on 1) How much effort it takes to
> modularize, 
>
It actually depends on the level of control you want to grant to the plugins. 
The most extreme case would be to export all the functions currently in the 
code - to do that, you'll have to provide a wrapper for each function you 
want to export. That's a lot of functions, but let's not forget that a 
significant part of those are only used by specific pieces of the code, so 
the actual useful number is definitely lower than that by a significant 
margin.
As for the code located in the module itself, there would be little to change; 
at most, the function names being called (to call the wrappers instead), and 
the initialization/termination code (which will quite probably be the same in 
most cases).

> 2) How effective the modularization API is designed (i.e. 
> currently the existing plugin API is vastly insufficient for server
> modularization) 
>
I think it is unsufficient for two reasons:
(a) The API provided to plugins is not complete enough;
(b) There are no ways for a plugin to interact with the server outside of the 
local/global events.

I think (a) can be completed as modularization advances - if I tried to make a 
plugin out of alchemy, I'd check all the "external dependencies", then move 
them into the plugin API if required. It however means that the API will be 
an evolving target as long as modularization is in its early stages, though. 
As for (b), as I said earlier, I think it can be solved by offering to 
plugins the possibility to hook themselves to some often used functions in 
the code. In such a case, I think the plugin code should get hooked by 
callbacks contained in objects whenever possible (so, instead of calling 
apply(op) and make a switch(op->type) in apply, the specific behavior of op 
would be directly bound into the object as a callback and called by 
op->apply(op)). In that scenario, there would be no overhead involved when 
compared to the current situation - it would basically replace a switch 
statement by a function call.

> and 3) Where we draw the line of what to modularize. 
>
I'm not sure a line has to be drawn to what/what not modularize. I think a 
more important question is: to what level should the modularization take 
place ? I don't think there are simple answer to those questions. I'm not 
even sure answering them in a definitive, strict way is really required.

> Personally, I don't think we should modularize very much, but if the API
> is good enough (which I would likely be picky about myself), then it
> might be worth doing for a limited number of things.
>

> Indeed. On this example, IMHO random maps are not optional, as they are
> essential to some quests, and also soon would be used by land plots  
> (though land plots would in my opinion be a relatively good thing to  
> implement as an optional-but-defaultly-on C plugin) 
>
Note that "optional/necessary for some quests" should not be a critera for 
modularization IMHO, because it is one you can use to justify nearly every 
function implemented in the game.

On the other hand, the "optional/necessary for the server to run" sounds much 
more relevant. Can the server work without random maps ? Of course - it 
simply means that the maps using that feature will not work, but the others 
will be completely unaffected. It has no impact on the gaming rules, and no 
influence on the characters. 

> Personally, I think that a C plugin interface for modularization, it 
> should provide full direct access to the data, though recommend use of  
> wrappers functions unless you know it's safe. 
>
Nothing currently prevents a plugin to modify the data it has access to 
directly - but of course, that's unsafe access, so if the plugin makes a bad 
modification to the data, or forgets to notify the server of it if necessary, 
then it will probably crash the server. Accessing data directly or through 
wrappers is basically a tradeoff between performances and security. 

In the case of modularization of the existing code, I'd say that direct access 
wherever possible should be kept - accessors for such data modifications 
would probably be used only for debugging purposes (as a wrapper can check if 
the data modification is "legal" or not, and thus can help detecting a whole 
range of errors). 

-- 
Yann Chachkoff
-----------------------
Garden Dwarf's Best Friend
-----------------------
GPG Key    : http://keyserver.veridis.com:11371/export?id=9080288987474372064
Fingerprint: 6616 2E02 BAD2 4AEF C90A  F1EB 7E03 AAB9 844D 25E0
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://shadowknight.real-time.com/pipermail/crossfire/attachments/20060117/b55430ba/attachment.pgp


More information about the crossfire mailing list