From: sangorrin Date: Thu, 17 Apr 2008 15:31:36 +0000 (+0000) Subject: updated everything to the new structure... it compiles ok... next step, make sure... X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fna.git/commitdiff_plain/9d6bf8516010004e76729c6e733f8904091aa11b updated everything to the new structure... it compiles ok... next step, make sure that the tests compile, then check that the corresponding messages are sent and find possible bugs (very probable to have forgotten some info in the requests..) and then adapt it to do sched analysis git-svn-id: http://www.frescor.org/private/svn/frescor/fna/trunk@1119 35b4ef3e-fd22-0410-ab77-dab3279adceb --- diff --git a/src_frescan/frescan_bwres.c b/src_frescan/frescan_bwres.c index 848ae3d..ac47359 100644 --- a/src_frescan/frescan_bwres.c +++ b/src_frescan/frescan_bwres.c @@ -68,7 +68,7 @@ int frescan_bwres_init(frescan_network_t net) * 1.- prepare a request * 2.- enqueue the request * 3.- wait in the reply object for a reply - * 4.- return the final values + * 4.- return the final values and free the request * */ @@ -76,13 +76,13 @@ int frescan_bwres_negotiate(frescan_network_t net, const frescan_contract_t *contract, frescan_ss_t *id) { - int ret, negotiation_ret; + int ret; frescan_request_id_t req; frescan_request_data_t *req_data; DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing a negotiation request\n"); - ret = frescan_request_alloc(&req); + ret = frescan_requests_alloc(&req); if (ret != 0) return ret; ret = frescan_requests_get_data(req, &req_data); @@ -103,7 +103,7 @@ int frescan_bwres_negotiate(frescan_network_t net, DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\n"); - ret = frescan_replyobject_wait(req_data->robj); + ret = frescan_bwres_robjs_wait(req_data->robj); if (ret != 0) return ret; ret = frescan_bwres_robjs_free(req_data->robj); @@ -131,7 +131,9 @@ int frescan_bwres_negotiate(frescan_network_t net, return -1; } - frescan_request_free(req); + DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "free the request\n"); + + frescan_requests_free(req); return ret; } diff --git a/src_frescan/frescan_bwres_requests.h b/src_frescan/frescan_bwres_requests.h index 2d442e3..cb635b6 100644 --- a/src_frescan/frescan_bwres_requests.h +++ b/src_frescan/frescan_bwres_requests.h @@ -21,8 +21,6 @@ #include "frescan_data.h" // frescan_contract_t #include "frescan_bwres_robjs.h" // frescan_robj_id_t -typedef uint16_t frescan_request_id_t; /* 0 .. MX_REQUESTS */ - /** * frescan_request_data_t * @@ -39,6 +37,8 @@ typedef uint16_t frescan_request_id_t; /* 0 .. MX_REQUESTS */ * */ +typedef uint16_t frescan_request_id_t; /* 0 .. MX_REQUESTS */ + typedef enum { FRESCAN_REQ_NEG = 0, // Negotiate a contract FRESCAN_REQ_RENEG = 1, // Renegotiate a contract diff --git a/src_frescan/frescan_bwres_threads.c b/src_frescan/frescan_bwres_threads.c index 9d7aefe..2f78a87 100644 --- a/src_frescan/frescan_bwres_threads.c +++ b/src_frescan/frescan_bwres_threads.c @@ -24,9 +24,6 @@ #include "frescan_data.h" #include "frescan_servers.h" -static void *frescan_manager_thread(void *arg); -static void *frescan_acceptor_thread(void *arg); - /** * frescan_manager_thread_create() * @@ -34,80 +31,59 @@ static void *frescan_acceptor_thread(void *arg); * in a request queue for LOCAL or EXTERNAL requests. */ +static void *frescan_manager_thread(void *arg); + int frescan_manager_thread_create(frescan_network_t net) { int ret; fosa_thread_attr_t attr; ret = fosa_thread_attr_init(&attr); - if (ret != 0) { - ERROR("could not init thread attributes\n"); - return ret; - } + if (ret != 0) return ret; ret = fosa_thread_attr_set_prio(&attr, FRESCAN_NEG_THREAD_PRIO); - if (ret != 0) { - ERROR("could not set neg thread prio %d\n", - FRESCAN_NEG_THREAD_PRIO); - return ret; - } + if (ret != 0) return ret; - ret = fosa_thread_create(&the_networks[net].neg_thread_id, - &attr, - frescan_master_neg_thread, - (void *)(uint32_t)net); - - if (ret != 0) { - ERROR("could not create the negotiator thread\n"); - return ret; - } + ret = fosa_thread_create(&the_networks[net].manager_thread_id, + &attr, + frescan_manager_thread, + (void *)(uint32_t)net); + if (ret != 0) return ret; ret = fosa_thread_attr_destroy(&attr); - if (ret != 0) { - ERROR("could not destroy thread attributes\n"); - return ret; - } + if (ret != 0) return ret; return 0; } /** * frescan_acceptor_thread_create() + * + * This call creates the acceptor thread which will be waiting negotiation + * messages from the network and converting them into requests. */ +static void *frescan_acceptor_thread(void *arg); + int frescan_acceptor_thread_create(frescan_network_t net) { int ret; fosa_thread_attr_t attr; ret = fosa_thread_attr_init(&attr); - if (ret != 0) { - ERROR("could not init thread attributes\n"); - return ret; - } + if (ret != 0) return ret; ret = fosa_thread_attr_set_prio(&attr, FRESCAN_ACCEPTOR_THREAD_PRIO); - if (ret != 0) { - ERROR("could not set acceptor thread prio %d\n", - FRESCAN_ACCEPTOR_THREAD_PRIO); - return ret; - } + if (ret != 0) return ret; ret = fosa_thread_create(&the_networks[net].acceptor_thread_id, - &attr, - frescan_acceptor_thread, - (void *)(uint32_t)net); - - if (ret != 0) { - ERROR("could not create the negotiator thread\n"); - return ret; - } + &attr, + frescan_acceptor_thread, + (void *)(uint32_t)net); + if (ret != 0) return ret; ret = fosa_thread_attr_destroy(&attr); - if (ret != 0) { - ERROR("could not destroy thread attributes\n"); - return ret; - } + if (ret != 0) return ret; return 0; } @@ -116,72 +92,56 @@ int frescan_acceptor_thread_create(frescan_network_t net) * frescan_manager_thread */ +static int frescan_manager_neg(frescan_request_data_t *req_data); +static int frescan_manager_reneg(frescan_request_data_t *req_data); +static int frescan_manager_cancel(frescan_request_data_t *req_data); +static int frescan_manager_repneg(frescan_request_data_t *req_data); + static void *frescan_manager_thread(void *arg) { - int err; - frescan_request_id_t request; - frescan_req_type_t type; - frescan_robj_id_t reply; - frescan_contract_t *contract; - frescan_neg_return_info_t *neg_return_info; - frescan_server_params_t server_params; + int ret; + frescan_request_id_t req; + frescan_request_data_t *req_data; frescan_network_t net = (uint32_t)arg; - DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "negotiator thread starts\n"); + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "manager thread starts\n"); while(1) { - DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "wait for a request\n"); - - err = frescan_requestqueue_dequeue(&request); - assert(err == 0); - - err = frescan_request_get_type(request, &type); - assert(err == 0); - - switch(type) { - case FRESCAN_NEGOTIATE: - DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, - "FRESCAN_NEGOTIATE request\n"); - err = frescan_request_get_contract(request, &contract); - assert(err == 0); - err = frescan_request_get_reply(request, &reply); - assert(err == 0); - err = frescan_request_get_return_info - (request, (void *)&neg_return_info); - assert(err == 0); - - // TODO: sched test + add contract to table - // so far always accepted witht he min values - neg_return_info->error = 0; - server_params.values = contract->min_values; - server_params.prio = contract->prio; - - err = frescan_servers_create - (net, - &server_params, - &neg_return_info->id); - assert(err == 0); - - err = frescan_replyobject_signal(reply); - assert(err == 0); - break; + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "wait for a request\n"); - case FRESCAN_RENEGOTIATE: - DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, - "FRESCAN_RENEGOTIATE request\n"); - break; + ret = frescan_requests_dequeue(&req); + assert(ret == 0); - case FRESCAN_CANCEL: - DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, - "FRESCAN_CANCEL request\n"); - break; + ret = frescan_requests_get_data(req, &req_data); + assert(ret == 0); + switch(req_data->type) { + case FRESCAN_REQ_NEG: + ret = frescan_manager_neg(req_data); + assert(ret == 0); + break; + case FRESCAN_REQ_RENEG: + ret = frescan_manager_reneg(req_data); + assert(ret == 0); + break; + case FRESCAN_REQ_CANCEL: + ret = frescan_manager_cancel(req_data); + assert(ret == 0); + break; + case FRESCAN_REP_NEG: + ret = frescan_manager_repneg(req_data); + assert(ret == 0); + break; default: - ERROR("wrong request type %d\n", type); + ERROR("request type not supported\n"); + assert(0); } - } - return NULL; + if(req_data->request_node != the_networks[net].local_node) { + ret = frescan_requests_free(req); + assert(ret == 0); + } + } } /** @@ -191,35 +151,91 @@ static void *frescan_manager_thread(void *arg) static void *frescan_acceptor_thread(void *arg) { int ret; - frescan_recv_params_t params; - uint8_t msg[200]; + frescan_recv_params_t recv_params; + uint8_t msg[2000]; // TODO: use a constant with the max neg message size size_t recv_bytes; frescan_node_t from; frescan_prio_t prio; + frescan_request_id_t req; + frescan_request_data_t *req_data; - DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG, - "master acceptor thread starts\n"); + DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG, "acceptor th starts\n"); - params.net = (frescan_network_t)(uint32_t)arg; - params.channel = FRESCAN_NEG_CHANNEL; - params.flags = FRESCAN_SYNC; + recv_params.net = (frescan_network_t)(uint32_t)arg; + recv_params.channel = FRESCAN_NEG_CHANNEL; + recv_params.flags = FRESCAN_SYNC; while(1) { DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG, - "waiting for msg, net:%u chan:%u flags:%u\n", - params.net, params.channel, params.flags); - - ret = frescan_recv(¶ms, msg, 200, - &recv_bytes, &from, &prio); + "waiting for a msg, net:%u chan:%u flags:%u\n", + recv_params.net, recv_params.channel, recv_params.flags); + + ret = frescan_recv(&recv_params, + msg, + sizeof(msg), + &recv_bytes, + &from, + &prio); assert(ret == 0); DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG, "msg received, from:%u size:%u prio:%u\n", from, recv_bytes, prio); - ret = frescan_message_parse(params.net, msg, recv_bytes, from); + ret = frescan_requests_alloc(&req); + assert(ret == 0); + + ret = frescan_requests_get_data(req, &req_data); + assert(ret == 0); + + ret = frescan_message_to_request(msg, req_data); + assert(ret == 0); + + req_data->request_node = from; + + ret = frescan_requests_enqueue(req); assert(ret == 0); } return NULL; } + +/** + * frescan_manager_neg + */ + +static int frescan_manager_neg(frescan_request_data_t *req_data) +{ + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "negotiation request\n"); + return 0; +} + +/** + * frescan_manager_neg + */ + +static int frescan_manager_reneg(frescan_request_data_t *req_data) +{ + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n"); + return 0; +} + +/** + * frescan_manager_neg + */ + +static int frescan_manager_cancel(frescan_request_data_t *req_data) +{ + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n"); + return 0; +} + +/** + * frescan_manager_neg + */ + +static int frescan_manager_repneg(frescan_request_data_t *req_data) +{ + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "reply to neg request\n"); + return 0; +} diff --git a/src_frescan/frescan_data.h b/src_frescan/frescan_data.h index 88ca6c3..b857d87 100644 --- a/src_frescan/frescan_data.h +++ b/src_frescan/frescan_data.h @@ -163,8 +163,8 @@ typedef struct { * support several interfaces for the same network. * @fd: file descriptor associated to /dev/canXX * @repl_thread_id: replenishment thread id - * @neg_thread_id: master local negotiator thread id (only master node has it) - * @acceptor_thread_id: acceptor negotiation thread id (all nodes have one) + * @manager_thread_id: manager thread id + * @acceptor_thread_id: acceptor thread id * @neg_messages_ss_id: sporadic server for negotiation messages * @queues: the queues of this network instance * @last_packet: pointer to the last packet from which a frame was inserted @@ -187,7 +187,7 @@ typedef struct { frescan_node_t local_node; int fd; fosa_thread_id_t repl_thread_id; - fosa_thread_id_t neg_thread_id; + fosa_thread_id_t manager_thread_id; fosa_thread_id_t acceptor_thread_id; frescan_ss_t neg_messages_ss_id; frescan_queues_t queues; diff --git a/src_frescan/frescan_debug.h b/src_frescan/frescan_debug.h index d0f34d7..668f875 100644 --- a/src_frescan/frescan_debug.h +++ b/src_frescan/frescan_debug.h @@ -52,9 +52,9 @@ #define FRESCAN_HW_BUFFER_ENABLE_DEBUG false #define FRESCAN_REPL_ENABLE_DEBUG false #define FRESCAN_REPLYOBJ_ENABLE_DEBUG false -#define FRESCAN_NEG_THREAD_ENABLE_DEBUG false #define FRESCAN_BWRES_ENABLE_DEBUG false #define FRESCAN_REQUESTS_ENABLE_DEBUG false +#define FRESCAN_MANAGER_ENABLE_DEBUG false #define FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG false #define FRESCAN_NEG_MESSAGES_ENABLE_DEBUG false #define FRESCAN_FNA_ENABLE_DEBUG false