/* initialize the stack */ StealStack* ss_init(int *argc, char ***argv) { StealStack* s = &stealStack; //only one s per thread needed /* Start up MPI */ MPI_Init(argc, argv); MPI_Comm_size(MPI_COMM_WORLD, &comm_size); MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank); if (comm_rank == 0 && comm_size == 1) ss_error("Error: Worksharing requires 2 or more MPI processes (1 work server, >= 1 worker)", 1); /* Reset timestamps */ msg_counter = 0; s->globalWork = 0; s->localWork = 0; s->nNodes = 0; s->nLeaves = 0; s->nAcquire = 0; s->nRelease = 0; s->nSteal = 0; s->nFail = 0; s->maxStackDepth = 0; s->maxTreeDepth = 0; localQueue = deq_create(); globalQueue = deq_create(); mkEmpty(s); return s; }
static int ema_exec(void *data, void *data2) { RAII_VAR(struct msg *, msg, (struct msg *)data, msg_decr); Quote *quote = (Quote *)msg->data; float *price; map_iter_t *iter = map_iter_create(); deq_t *prices; int size; NOT_USED(data2); /* FIXME */ if (fabs(quote->thyquote.m_dZXJ) <= 0.000001) { xcb_log(XCB_LOG_WARNING, "Invalid quote: '%d,%d,%s,%.2f'", quote->thyquote.m_nTime, quote->m_nMSec, quote->thyquote.m_cHYDM, quote->thyquote.m_dZXJ); goto end; } if ((price = ALLOC(sizeof (float))) == NULL) { xcb_log(XCB_LOG_WARNING, "Error allocating memory for price"); goto end; } *price = quote->thyquote.m_dZXJ; pthread_mutex_lock(&conlock); map_find(iter, contracts, quote->thyquote.m_cHYDM); if (!map_iter_valid(iter, contracts)) { const char *contract; if ((contract = mem_strdup(quote->thyquote.m_cHYDM)) == NULL) { xcb_log(XCB_LOG_WARNING, "Error allocating memory for contract"); pthread_mutex_unlock(&conlock); FREE(price); goto end; } prices = deq_create(); map_insert(contracts, contract, prices); } else prices = map_iter_value(iter); deq_push_back(prices, price); if ((size = deq_size(prices)) == n) { int i; float ema = *((float *)deq_at(prices, 0)); time_t t = (time_t)quote->thyquote.m_nTime; struct tm lt; char datestr[64], res[256]; float *front; for (i = 1; i < size; ++i) ema = (2.0 / (n + 1)) * *((float *)deq_at(prices, i)) + (1 - (2.0 / (n + 1))) * ema; strftime(datestr, sizeof datestr, "%F %T", localtime_r(&t, <)); snprintf(res, sizeof res, "EMA,%s.%03d,%s|%.2f", datestr, quote->m_nMSec, quote->thyquote.m_cHYDM, ema); out2rmp(res); front = deq_front(prices); FREE(front); deq_pop_front(prices); } pthread_mutex_unlock(&conlock); map_iter_destroy(iter); end: return 0; }