+++ /dev/null
-/*!
- * @file frescan_negotiator_thread.c
- *
- * @brief FRESCAN negotiator thread
- *
- * This module contains the negotiator thread, with an operation to create it.
- *
- * @version 0.01
- *
- * @date 1-Apr-2008
- *
- * @author Daniel Sangorrin <daniel.sangorrin@unican.es>
- *
- */
-
-#include <assert.h>
-#include "frescan_negotiator_thread.h"
-#include "fosa_threads_and_signals.h" // fosa_thread_attr_init...
-#include "frescan_config.h"
-#include "frescan_debug.h"
-#include "frescan_data.h"
-#include "frescan_requests_queue.h"
-#include "frescan_servers.h"
-
-static void *frescan_neg_thread(void *arg);
-
-/**
- * frescan_negotiator_thread_create()
- */
-
-int frescan_negotiator_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;
- }
-
- 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;
- }
-
- ret = fosa_thread_create(&the_networks[net].neg_thread_id,
- &attr,
- frescan_neg_thread,
- (void *)(uint32_t)net);
-
- if (ret != 0) {
- ERROR("could not create the negotiator thread\n");
- return ret;
- }
-
- ret = fosa_thread_attr_destroy(&attr);
- if (ret != 0) {
- ERROR("could not destroy thread attributes\n");
- return ret;
- }
-
- return 0;
-}
-
-/**
- * frescan_neg_thread - the thread that negotiates contracts
- */
-
-static void *frescan_neg_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;
-
- DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "negotiator 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((frescan_network_t)(uint32_t)arg,
- &server_params,
- &neg_return_info->id);
- assert(err == 0);
-
- err = frescan_replyobject_signal(reply);
- assert(err == 0);
- break;
-
- case FRESCAN_RENEGOTIATE:
- DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
- "FRESCAN_RENEGOTIATE request\n");
- break;
-
- case FRESCAN_CANCEL:
- DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
- "FRESCAN_CANCEL request\n");
- break;
-
- default:
- ERROR("wrong request type %d\n", type);
- }
- }
-
- return NULL;
-}