[AD] Proposal for new Allegro interface

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


Hi everyone,

Here is my proposal for a new Allegro interface:

1/. All symbol names are prefixed like this:
  al_      global symbol
  _al_     `internal' global symbol
  AL_      structure or preprocessor define

    Feel free to work out something better than this, but it is what
    I vote for, and seems fairly neutral.

2/. We actually change the library code itself to use these symbols;
    this is to avoid namespace collisions with other libraries. 
    The new names will be declared in `allegro4.h' (or possibly
    another name; again, feel free to work out something better).

3/. We rework allegro.h so that it exactly emulates the current
    names and behaviour. This is to maintain backward compatibility.
    In order to do this, we use typedef statements:

typedef struct AL_BITMAP BITMAP;
et al.

    and the following constructs:

#ifdef AL_COMPILER_INLINE
static inline void clear(BITMAP* bmp)
{
    al_clear(bmp);
}
#endif
static void clear(BITMAP* bmp) NO_WARNING_WIDGETRY
{
    al_clear(bmp);
}

    where NO_WARNING_WIDGETRY could be a function attribute under gcc, 
    etc., and AL_COMPILER_INLINE is defined if the compiler supports
    inline functions. In fact, if all compilers used for Allegro
    support the `inline' keyword, we don't need the conditional.

    As to how this affects code generation (this is under gcc, I don't
    use any other compiler, but I believe we can expect similar 
    results):     (gcc 2.95.2)

    a/. In totally unoptimised compilation, inline functions aren't  
        supported, so an extra indirection is added. This consists of
        some stack operations and a jump.

    b/. With -O or -O2 (ie. some optimisation), the inline function
        call is completely non-existent; it is as if we called the
        function by its prefixed name.

    c/. With -O3 (which turns on -finline-functions, ie. gcc ignores
        the `inline' keyword and decides itself which functions
        should be inlined), both the inline and the static function
        calls are non-existent.

    I generated these results by using these two files:
default: test1.s test2.s test3.s test4.s

test1.s : test.c
	gcc -S $^ -o $@

test2.s : test.c
	gcc -O1 -S $^ -o $@

test3.s : test.c
	gcc -O2 -S $^ -o $@

test4.s : test.c
	gcc -O3 -S $^ -o $@

int other_func(int);

static inline int test_inline(int i)
{
    return other_func(i);
}

static int test_static(int i)
{
    return other_func(i);
}

void driver_inline(int i)
{
    test_inline(i);
}

void driver_static(int i)
{
    test_static(i);
}

void driver_direct(int i)
{
    other_func(i);
}

    Could Eric or Owen or somebody take a look at the assembly generated
    under MSVC and let me know if the same is true (or just mail it to
    me).

4/. We take the opportunity to change any recently introduced API 
    additions which seem broken (are there any?), and we also provide
    additional functions to fix a few things that have always been
    broken. The example that springs to mind is 6-bit palettes.

Here is my analysis of advantages/disadvantages:

Plus:

 - a nice, clean, non-polluting API. Coexistence with other libraries.
   (I don't feel that the argument `using two or more libraries is a
   very advanced features' justifies leaving this broken forever; it
   just requires a very advanced solution);

 - unless the programmer uses no optimisation, there is no effect
   on generated code or execution;

 - no preprocessor trickery to break things;

 - #include <allegro4.h> will get you the new API, and
   #include <allegro.h> will get you the old. No need for horrible
   #defines anywhere, and *all old code will continue to work as is*;

 - no compile-time options, so no need to have multiple Allegro .so 
   files for the same Allegro.

Minus:

 - somebody has to do all the work (I'll do it, though);

 - increases complexity slightly, both when maintaining code and
   when adding new stuff (because you need to think of two function
   names :-P ).

Please send your thoughts. If generally positive, and nobody raises any
unsolvable technical issues, I'll write a patch and submit it for
examination.

Bye for now,
-- 
Laurence Withers, lwithers@xxxxxxxxxx
                http://www.lwithers.demon.co.uk/

Attachment: signature.asc
Description: PGP signature



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/