Forums de discussion

Entraide Code source

jtraulle Membre non connecté

Administrateur

Rang

Avatar

Groupe : PicardieLibre.org

Inscrit le : 05/12/2008 à 12h23

Messages: 189

Le 15/11/2009 à 22h48
Discussion originellement initiée par Zolotaya



Sujet copié/collé dans le cadre de la migration du forum phpbb3 vers phpboost.




Hello,







afin de diversifier l'activité sur ce forum, je vous propose un petit jeu : le "que fait ce code"



Tout est dans le titre, on donne code non commenter et les gens doivent expliquer ce qu'il fait. Je vous donnerez la réponse (si personne n'a trouvé) lundi prochain.







Code :

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include "pingpong.h"


int main ( int argc, char *argv[]){
        create_ctx(16384, f_pong, NULL);
        create_ctx(16384, f_ping, NULL);
        yield();
        exit(EXIT_SUCCESS);
}

void f_ping(void *args)
{
        while(1) 
    {
            printf("A") ;
            yield();
            printf("B") ;
            yield();
            printf("C") ;
            yield();
        }
}

void f_pong(void *args)
{
        while(1) 
    {
               printf("1") ;
            yield();
            printf("2") ;
            yield();
            printf("3") ;
            yield();
        }
}

int init_ctx(struct ctx_s *ctx, int stack_size, func_t f, void *args)
{
    ctx->stack = malloc(stack_size);
    if (!ctx->stack) return 0;
    ctx->esp = (void *)((unsigned char*)ctx->stack + stack_size - 4    );
    ctx->ebp = (void *)((unsigned char*)ctx->stack + stack_size - 4    );
    ctx->f = f;
    ctx->args = args;
    ctx->etat=INITIAL;
    ctx->ctx_magic = CTX_MAGIC;
}


void switch_to_ctx(struct ctx_s *ctx)
{
    assert(ctx->ctx_magic==CTX_MAGIC);
    assert(ctx->etat!=FINI);
    if (current_ctx)
        asm("movl %%esp, %0" "n" "movl %%ebp, %1"
            :"=r"(current_ctx->esp),
            "=r"(current_ctx->ebp) 
        );
    current_ctx=ctx;
    asm("movl %0, %%esp" "n" "movl %1, %%ebp"
        :
        :"r"(current_ctx->esp),
         "r"(current_ctx->ebp)
    );
    if (current_ctx->etat == INITIAL)
    {
        start_current_ctx();
    }


void start_current_ctx(void)
{
    current_ctx->etat=ACTIF;
    current_ctx->f(current_ctx->args);  
    current_ctx->etat=FINI;
    free(current_ctx->stack);
    exit(EXIT_SUCCESS);
}


int create_ctx(int stack_size, func_t f, void *args)
{
    struct ctx_s *new_ctx_s = (struct ctx_s *)malloc(sizeof(struct ctx_s));
    if (! new_ctx_s) return 0;

    init_ctx(new_ctx_s, stack_size, f, args);

    if ( (!current_ctx) && (!first_ctx)) 
    {
        new_ctx_s->next = new_ctx_s;    
        first_ctx = new_ctx_s;
    }
    else if (current_ctx)
    {
        new_ctx_s->next = current_ctx->next;
        current_ctx->next = new_ctx_s;
    }
    else 
    {
        new_ctx_s->next = first_ctx->next;
        first_ctx->next = new_ctx_s;
    }    
}

void yield(void)
{
    if (current_ctx)
        switch_to_ctx(current_ctx->next);
    else
        switch_to_ctx(first_ctx);
}










le point h



Code :


#ifndef _PINGPONG_H_
#define _PINGPONG_H_

#define EXIT_SUCCESS 0
#define CTX_MAGIC 0xDEADBEEF
enum ctx_state_e {FINI, ACTIF, INITIAL};


typedef void (func_t)(void *);


struct ctx_s {
    void *esp;
    void *ebp;
    void *args;
    void *stack;
    enum ctx_state_e etat;
    func_t *f;
    unsigned int ctx_magic;
    struct ctx_s *next;
};

struct ctx_s *current_ctx = NULL;
struct ctx_s *first_ctx = NULL;

void f_ping(void *arg);
void f_pong(void *arg);
void switch_to_ctx(struct ctx_s *ctx);
void start_current_ctx(void);
void yield(void);

int init_ctx(struct ctx_s *ctx, int stack_size, func_t f, void *args);
int create_ctx(int stack_size, func_t f, void* args);

#endif









le make file :



Code :

all: pingpong

pingpong: pingpong.o
    gcc  -o pingpong pingpong.o  

pingpong.o: pingpong.c
    gcc -c pingpong.c









Normalement tout y est!! En cas de problème prévenez moi sur le forum ;)







Ça serait marrant que tout le monde présente le travail effectué de cette façon, cela permet de faire travailler et réfléchir tout le monde.







Bon courage à tous,



Zolotaya







Réponses des membres du forum phpboost provisoire









exeral :
un pingpong ?



sémarké-dan-le-fichié :crazy



keskejégagné ?








zolotaya :
Le droit d'expliquer comment on y joue :D








faelar :
Quotation :
"que fait ce code"




asm( ... );



Il fait vomir :)


Tant qu'on désire on peut se passer d'être heureux ; on s'attend à le devenir : si le bonheur ne vient point, l'espoir se prolonge, et le charme de l'illusion dure autant que la passion qui le cause. [...]
Malheur à qui n'a plus rien à désirer ! Rousseau, La Nouvelle Héloïse (1761)
   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie