Exemple #1
0
static void server_deleteByIdJSON(http_request_t request, socket_t* client, worker_t** workers)
{
    int id;
    char* getId = strpbrk(request.uri, "0123456");
    if(getId)
    {
        id = atoi(getId);
        if(id<0 || id>6 || worker_getId(workers[id]) == -1)
        {
            socket_write_string(client, "<h1>Wrong ID</h1><p><a href=\"/workers/\">All workers</a></p>");
            return;
        }
    }
    else
    {
        server_notFound(client);
        return;
    }
    char toSend[2000];
    char buffer[2000];
    sprintf(buffer,
            "Success!"
            "Worker %s successfully deleted!", worker_getName(workers[id]));

    workers[id] = worker_new();

    sprintf(toSend,
            "HTTP/1.1 200 OK\n"
            "Content-Type: application/json\n"
            "Content-Length: %i\r\n\r\n"
            "\n%s", strlen(buffer), buffer);

    socket_write_string(client, toSend);
    socket_close(client);
}
Exemple #2
0
/*
 * queue_new:
 *
 * Create a new workload queue.
 *
 * Returns the newly created #Queue.
 */
Queue*
queue_new (void)
{
	Queue* queue = g_slice_new0 (Queue);
	gint thread;
	gint n_threads = get_n_processors (); /* FIXME: make G_GNUC_CONST and put into loop argument? */

	for (thread = 0; thread < n_threads; thread++) {
		GError* error = NULL;
		Worker* worker = worker_new (thread, &error);

		if (!error) {
			queue->threads = g_list_prepend (queue->threads, worker);
			queue->idle_threads = g_list_prepend (queue->idle_threads, worker);
		} else {
			g_printerr ("error creating thread %d (%d of %d)\n",
				    worker->id, thread + 1, n_threads);
		}
	}
	queue->threads = g_list_reverse (queue->threads);

	queue->jobs = g_queue_new ();

	return queue;

}
Exemple #3
0
static void server_personalTask(http_request_t request, socket_t* client, db_t* base)
{
    char salaryReq[10], salaryVal[10], yearReq[10], yearVal[10], toSend[10000];
    char* str = strtok(request.uri, "?&=");
    str = strtok(NULL, "?&=");
    strcpy(salaryReq, str); // salary_m || salary_l
    str = strtok(NULL, "?&=");
    strcpy(salaryVal, str); // salary value
    str = strtok(NULL, "?&=");
    strcpy(yearReq, str);   // year_m || year_l
    str = strtok(NULL, "?&=");
    strcpy(yearVal, str);   // year value
    int count = db_countWorkers(base);

    worker_t** workers[count];
    for(int i = 0; i<count; i++)
        workers[i] = worker_new();

    str = db_personalTask(base, salaryReq, atoi(salaryVal), yearReq, atoi(yearVal), workers);

    sprintf(toSend,
            "HTTP/1.1 200 OK\n"
            "Content-Type: application/json\n"
            "Content-Length: %i\r\n\r\n"
            "\n%s", strlen(str)+1, str);

    for(int i = 0; i<count; i++)
        worker_free(workers[i]);

    socket_write_string(client, toSend);
    socket_close(client);
}
Exemple #4
0
static char* server_getAllWorkersHTML(db_t* base)
{
    char allOfTHem[10000] = "";
    char one[1000];
    int count = db_countWorkers(base);
    worker_t** workers[count];
    for(int i = 0; i<count; i++)
        workers[i] = worker_new();

    db_fillWorkerArr(base, workers);

    for(int i = 0; i < count; i++)
    {
        sprintf(one,
                "    <p>Id: %i<br>"
                "     Name: <a href=\"/workers/%i\">%s</a><br>"
                "     <a href=\"/workers/delete/%i\">Free worker</a>"
                "     <br><br></p>",
                worker_getId(workers[i]), worker_getId(workers[i]), worker_getName(workers[i]),
                worker_getId(workers[i]));
        strcat(allOfTHem, one);
    }
    strcat(allOfTHem, "<a href=\"/workers/new/\">New worker</a>");
    for(int i = 0; i<count; i++)
        worker_free(workers[i]);
    return allOfTHem;
}
int main ()
{
    float time = 0;
    int valid = 1;
    FILE *f = fopen ("asynclocklessresultsN", "a");
    int n = 100;
    N = 0;
    while ((N+=1000) < 100000)
    {
        int i = 0;
        time = 0;
        while (i++ < 10){
        clock_t t1, t2;
        Data data;
        SynchronisingThread *mainThread;
        Worker **workers;
        data.value = 0;
        t1 = clock ();  
        mainThread = synchronising_thread_new (n, &data);
        int a = synchronising_thread_start (mainThread);
        if (a)
        {
           printf ("Error creating Main Thread");
        }

        workers = malloc (sizeof (Worker *) *n);
        int i;
        for (i = 0; i < n; i++)
        {
            workers[i] = worker_new (mainThread, i, worker_thread_func);
            int ans = worker_start (workers[i]);
    
            if (ans)
            {
                printf ("Error creating thread %d", i);
            }
        }    
        
        for (i = 0; i < n; i++)
        {
            worker_join (workers[i]);
            free (workers[i]);
        }
        free (workers);
        synchronising_thread_exit (mainThread, 1);
        synchronising_thread_join (mainThread);
        synchronising_thread_free (mainThread);
        //free (mainThread);
        t2 = clock ();
        printf ("%d\n", data.value);
        time += (((float)t2 - (float)t1) / 1000000.0 ) * 1000;
        }
        printf ("Timeout: %f for N: %d\n", time/i, N);
        fprintf (f, "Timeout: %f for N: %d\n", time/i, N);
        fflush (f);
     }
    fclose (f);
    return 0;
}
Exemple #6
0
static void getEventsForLastHour_NoOne_countZero(void ** state){
    callback rc = reaction;
    turniket_t turniket = turniket_create(rc);
    worker_t worker1 = worker_new("Andrey Krysyuk", ALLOWED);
    worker_t worker2 = worker_new("Olga Yashan", ALLOWED);
    event_t event1 = event_new(worker1, 1000, INSIDE);
    event_t event2 = event_new(worker2, 1200, INSIDE);

    turniket_addEvent(turniket, event1);
    turniket_addEvent(turniket, event2);
    list_t * forLastHour = list_new();
    int count = turniket_getEventsForLastHour(turniket, forLastHour, 1500);
    assert_int_equal(count , 0);
    turniket_delete(turniket);
    event_delete(event1);
    event_delete(event2);
    worker_delete(worker1);
    worker_delete(worker2);
}
Exemple #7
0
static void getEventsForLastHour_fourEvents_countTwo(void ** state){
    callback rc = reaction;
    turniket_t turniket = turniket_create(rc);
    worker_t worker1 = worker_new("Andrey Krysyuk", ALLOWED);
    worker_t worker2 = worker_new("Olga Yashan", ALLOWED);
    event_t event1 = event_new(worker1, 1230, INSIDE);
    event_t event2 = event_new(worker2, 1200, INSIDE);
    event_t event3 = event_new(worker1, 1250, OUTSIDE);
    event_t event4 = event_new(worker2, 1255, OUTSIDE);
    turniket_addEvent(turniket, event1);
    turniket_addEvent(turniket, event2);
    turniket_addEvent(turniket, event3);
    turniket_addEvent(turniket, event4);
    list_t * forLastHour = list_new();
    int count = turniket_getEventsForLastHour(turniket, forLastHour, 1300);
    assert_int_equal(count , 2);
    turniket_delete(turniket);
    event_delete(event1);
    event_delete(event2);
    event_delete(event3);
    event_delete(event4);
}
Exemple #8
0
struct server *
server_new(const char *cfg_file) {
	
	int i;
	struct server *s = calloc(1, sizeof(struct server));

	s->cfg = conf_read(cfg_file);

	/* workers */
	s->w = calloc(s->cfg->http_threads, sizeof(struct worker*));
	for(i = 0; i < s->cfg->http_threads; ++i) {
		s->w[i] = worker_new(s);
	}
	return s;
}
Exemple #9
0
server_t *server_new() {
    server_t *s = (server_t *)zd_malloc(sizeof(server_t));

    s->conn = NULL;
    s->endpoints = array_new(sizeof(endpoint_t));
    s->receivers = array_new(sizeof(receiver_t *));
    s->workers   = array_new(sizeof(worker_t *));

    int i;
    for (i = 0; i < 4; i++) {
        worker_t *worker = worker_new();
        worker->server = s;
        array_push_back(s->workers, &worker);
    }
    s->curr_worker = 0;

    return s;
}
Exemple #10
0
gpointer worker_runParallel(WorkLoad* workload) {
    utility_assert(workload);
    /* get current thread's private worker object */
    Worker* worker = worker_new(workload->slave);

    /* continuously run all events for this worker's assigned nodes.
     * the simulation is done when the engine is killed. */
    while(!slave_isKilled(worker->slave)) {
        SimulationTime barrier = slave_getExecutionBarrier(worker->slave);
        guint nEventsProcessed = 0;
        guint nNodesWithEvents = 0;

        GList* item = workload->hosts;
        while(item) {
            Host* node = item->data;
            guint n = _worker_processNode(worker, node, barrier);
            nEventsProcessed += n;
            if(n > 0) {
                nNodesWithEvents++;
            }
            item = g_list_next(item);
        }

        slave_notifyProcessed(worker->slave, nEventsProcessed, nNodesWithEvents);
    }

    /* free all applications before freeing any of the nodes since freeing
     * applications may cause close() to get called on sockets which needs
     * other node information.
     */
    GList* hosts = workload->hosts;
    while(hosts) {
        worker->cached_node = hosts->data;
        host_freeAllApplications(worker->cached_node);
        worker->cached_node = NULL;
        hosts = hosts->next;
    }

    g_list_foreach(workload->hosts, (GFunc) host_free, NULL);

//    g_thread_exit(NULL);
    return NULL;
}
Exemple #11
0
static struct db *_db_new(const char *directory)
{
	struct db *db = malloc(sizeof(struct db));
	memset(db, 0, sizeof(struct db));
	db->log_fd = 2; /* stderr */

	db->log_dir = dir_open(db, directory);
	if (db->log_dir == NULL) {
		free(db);
		return NULL;
	}
	db->worker = worker_new(db);
	if (db->worker == NULL) {
		dir_free(db->log_dir);
		free(db);
		return NULL;
	}
	return db;
}
Exemple #12
0
Slave* slave_new(Master* master, Configuration* config, guint randomSeed) {
    Slave* slave = g_new0(Slave, 1);
    MAGIC_INIT(slave);

    g_mutex_init(&(slave->lock));
    g_mutex_init(&(slave->pluginInitLock));

    slave->master = master;
    slave->config = config;
    slave->random = random_new(randomSeed);

    slave->rawFrequencyKHz = utility_getRawCPUFrequency(CONFIG_CPU_MAX_FREQ_FILE);
    if(slave->rawFrequencyKHz == 0) {
        info("unable to read '%s' for copying", CONFIG_CPU_MAX_FREQ_FILE);
    }

    slave->hosts = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL);
    slave->programs = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, (GDestroyNotify)program_free);

    slave->dns = dns_new();

    slave->nWorkers = (guint) configuration_getNWorkerThreads(config);
    slave->mainThreadWorker = worker_new(slave);

    slave->cwdPath = g_get_current_dir();
    slave->dataPath = g_build_filename(slave->cwdPath, "shadow.data", NULL);
    slave->hostsPath = g_build_filename(slave->dataPath, "hosts", NULL);

    if(g_file_test(slave->dataPath, G_FILE_TEST_EXISTS)) {
        gboolean success = utility_removeAll(slave->dataPath);
        utility_assert(success);
    }

    gchar* templateDataPath = g_build_filename(slave->cwdPath, "shadow.data.template", NULL);
    if(g_file_test(templateDataPath, G_FILE_TEST_EXISTS)) {
        gboolean success = utility_copyAll(templateDataPath, slave->dataPath);
        utility_assert(success);
    }
    g_free(templateDataPath);

    return slave;
}
Exemple #13
0
static char* server_getAllWorkersJSON(db_t* base)
{
    char allOfTHem[4000] = "";
    int count = db_countWorkers(base);
    worker_t** workers[count];

    for(int i = 0; i<count; i++)
        workers[i] = worker_new();

    db_fillWorkerArr(base, workers);

    for(int i = 0; i < count; i++)
    {
        strcat(allOfTHem, worker_makeWorkerJSON(workers[i]));
    }

    for(int i = 0; i<count; i++)
        worker_free(workers[i]);

    return allOfTHem;
}
Exemple #14
0
server *
server_new(conf *cfg, logger *log) {
	int i;

	server *s;
	s = calloc(1, sizeof(server));

	/* read cfg file */
	s->cfg = cfg;

	/* log */
	s->log = log;

	/* setup workers */
	s->w = calloc(s->cfg->workers, sizeof(worker *));
	for(i=0; i<s->cfg->workers; i++) {
		s->w[i] = worker_new(s);
	}
	log_it(s->log, PULSAR_DEBUG, "workers initialized ...");

	return s;
}
Exemple #15
0
LPWORKER worker_pop (void)
{
  LPWORKER lpWorkerFree = NULL;

  WaitForSingleObject(hWorkersMutex, INFINITE);
  /* Get the first worker of the list */
  if (lpWorkers != NULL)
  {
    lpWorkerFree = lpWorkers;
    lpWorkers = LIST_NEXT(LPWORKER, lpWorkers);
  }
  nWorkersCurrent++;
  nWorkersMax = (nWorkersCurrent > nWorkersMax ? nWorkersCurrent : nWorkersMax);
#ifdef DBUG
  dbug_print("Workers running current/runnning max/waiting: %d/%d/%d",
      nWorkersCurrent,
      nWorkersMax,
      list_length((LPLIST)lpWorkers));
#endif
  ReleaseMutex(hWorkersMutex);

  if (lpWorkerFree == NULL)
  {
    /* We cannot find a free worker, create one. */
    lpWorkerFree = worker_new();
  }

  /* Ensure that we don't get dangling pointer to old data. */
  list_init((LPLIST)lpWorkerFree);
  lpWorkerFree->lpJobUserData = NULL;

  /* Reset events */
  ResetEvent(lpWorkerFree->hJobStarted);
  ResetEvent(lpWorkerFree->hJobStop);
  ResetEvent(lpWorkerFree->hJobDone);

  return lpWorkerFree;
}
Exemple #16
0
static void server_post(http_request_t request, socket_t* client, db_t* base)
{
    char buffer[2000] ="";

    char* name = http_request_getArg(&request, "name");
    char* surname = http_request_getArg(&request, "surname");
    char* salary = http_request_getArg(&request, "salary");
    char* year = http_request_getArg(&request, "year");

    if(strlen(name) <= 1 || strlen(surname) <= 1)
    {
        server_send(client, "Name/Surname wasn't filled in"
                            "<p><a href=\"/workers/new/\">Back to POST</a></p>");
        return;
    }

   if(isdigit(salary[0]) == 0 || isdigit(year[0])==0)
    {
        server_send(client, "Wrong data!"
                    "<p><a href=\"/workers/new/\">Back to POST</a></p>");
        return;
    }

    if(salary == " ")
        salary = "0";

    if(year == " ")
        year = "0";

    worker_t* worker = worker_new();
    worker_fill(worker, -1, name, surname, atoi(salary), atoi(year));
    db_insertWorker(base, worker);
    worker_free(worker);
    server_send(client, "Success"
                "<p><a href=\"/workers/\">All workers</a></p>");

}
Exemple #17
0
// Function responsible for the workers on current TM node.
void *worker(void *ptr)
{
    int my_rank = COMM_get_rank_id(); 
    int task_id, j_id=0;                                        // j_id = journal id for current thread.
    struct tm_thread_data *d = (struct tm_thread_data *) ptr;
    struct byte_array * task;
    struct result_node * result;
    uint64_t buffer;
    struct j_entry * entry;

    workerid = d->id;

    void* (*worker_new) (int, char **);
    worker_new = dlsym(d->handle, "spits_worker_new");

    void (*execute_pit) (void *, struct byte_array *, struct byte_array *);
    execute_pit = dlsym(d->handle, "spits_worker_run");

    void* (*worker_free) (void *);
    worker_free = dlsym(d->handle, "spits_worker_free");

    void *user_data = worker_new ? worker_new(d->argc, d->argv) : NULL;

    if(TM_KEEP_JOURNAL > 0) {
        j_id = JOURNAL_get_id(d->dia, 'W');
    }

    sem_wait (&d->tcount);                                      // wait for the first task to arrive.
    while (d->running) {
        pthread_mutex_lock(&d->tlock);                          // Get a new task.
        cfifo_pop(&d->f, &task);
        pthread_mutex_unlock(&d->tlock);

        // Warn the Task Manager about the new space available.
        sem_post(&d->sem);

        byte_array_unpack64(task, &buffer);
        task_id = (int) buffer;
        debug("[worker] Received TASK %d", task_id);
        
        //_byte_array_pack64(task, (uint64_t) task_id);           // Put it back, might use in execute_pit.
        result = (struct result_node *) malloc(sizeof(struct result_node));
        byte_array_init(&result->ba, 10);
        byte_array_pack64(&result->ba, task_id);                // Pack the ID in the result byte_array.
        byte_array_pack64(&result->ba, my_rank);

        if(TM_KEEP_JOURNAL > 0) {
            entry = JOURNAL_new_entry(d->dia, j_id);
            entry->action = 'P';
            gettimeofday(&entry->start, NULL);
        }

        debug("[--WORKER] task: %d", task);
        debug("[--WORKER] &result->ba: %d", &result->ba);
        execute_pit(user_data, task, &result->ba);              // Do the computation.

        if(TM_KEEP_JOURNAL > 0) {
            gettimeofday(&entry->end, NULL);
        }

        byte_array_free(task);                                  // Free memory used in task and pointer.
        free(task);                                             // For now, each pointer is allocated in master thread.

        debug("Appending task %d.", task_id);
        pthread_mutex_lock(&d->rlock);                          // Pack the result to send it later.
        result->next = d->results; 
        result->before = NULL;
        result->task_id = task_id;
        if(d->results != NULL) {
            d->results->before = result;
        }
        d->results = result;
        
        if(d->is_blocking_flush==1) {
            if(TM_NO_WAIT_FINAL_FLUSH > 0) {
                sem_post(&d->no_wait_sem);
            }
            else {
                d->bf_remaining_tasks--;
                if(d->bf_remaining_tasks==0) {
                    pthread_mutex_unlock(&d->bf_mutex);
                }
            }
        }
            
        pthread_mutex_unlock(&d->rlock);

        sem_wait (&d->tcount);                                  // wait for the next task to arrive.
    }

    if (worker_free) {
        worker_free(user_data);
    }

    //free(result);
    pthread_exit(NULL);
}
Exemple #18
0
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HINSTANCE hInst;

    static HWND hButtonEx, hLable;
    static HWND hStaticIndS, hStaticNameS, hStaticSurnameS, hStaticExpS, hStaticSalarS;
    static HWND hStaticName, hStaticSurname, hStaticExp, hStaticSalar;

    static worker_t * worker[WORKERS_COUNT];

    static int index;
    static char buffer[10];
    static int tick;

    switch(msg)
    {
    case WM_CREATE:
        CreateWindowW(
                    L"button",
                    L"Timer",
                    WS_CHILD|WS_VISIBLE|BS_CHECKBOX|BS_AUTOCHECKBOX,
                    90, 150, 130, 23,
                    hwnd,
                    (HMENU)TIMER_CB,
                    NULL,
                    NULL);

        hButtonEx = CreateWindowEx(0,
                    WC_BUTTON,
                    "Exit",
                    WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_DEFPUSHBUTTON,
                    90, 190, 130, 23,
                    hwnd,
                    (HMENU)BUTTON_EX,
                    hInst,
                    NULL);

        hStaticIndS = CreateWindowEx(0,
                    WC_STATIC,
                    "Index:",
                    WS_CHILD|WS_VISIBLE,
                    10, 20, 130, 23,
                    hwnd,
                    (HMENU)STATIC_INDEX_S,
                    hInst,
                    NULL);

        hStaticNameS = CreateWindowEx(0,
                    WC_STATIC,
                    "Name:",
                    WS_CHILD|WS_VISIBLE,
                    10, 44, 130, 23,
                    hwnd,
                    (HMENU)STATIC_NAME_S,
                    hInst,
                    NULL);

        hStaticSurnameS = CreateWindowEx(0,
                    WC_STATIC,
                    "Surname:",
                    WS_CHILD|WS_VISIBLE,
                    10, 68, 130, 23,
                    hwnd,
                    (HMENU)STATIC_SURNAME_S,
                    hInst,
                    NULL);

        hStaticExpS = CreateWindowEx(0,
                    WC_STATIC,
                    "Experience:",
                    WS_CHILD|WS_VISIBLE,
                    10, 92, 130, 23,
                    hwnd,
                    (HMENU)STATIC_EXP_S,
                    hInst,
                    NULL);

        hStaticSalarS = CreateWindowEx(0,
                    WC_STATIC,
                    "Salary:",
                    WS_CHILD|WS_VISIBLE,
                    10, 116, 130, 23,
                    hwnd,
                    (HMENU)STATIC_SALARY_S,
                    hInst,
                    NULL);

        index = rand() % WORKERS_COUNT;

        worker[0] = worker_new(0, "George", "Horn", 6, 6000);
        worker[1] = worker_new(1, "Emily", "Wiggins", 2, 2000);
        worker[2] = worker_new(2, "Claude", "Jefferson", 3, 3000);
        worker[3] = worker_new(3, "Ursula", "Miller", 1, 1000);
        worker[4] = worker_new(4, "Damian", "Fields", 4, 4500);

        tick = worker_getIndex(worker[index]);

        hLable = CreateWindowEx(0,
                    "STATIC",
                    itoa(worker_getIndex(worker[index]), buffer, 10),
                    WS_CHILD|WS_VISIBLE,
                    150, 20, 130, 23,
                    hwnd,
                    (HMENU)LABLE_ID,
                    hInst,
                    NULL);
        int ret = SetTimer(hwnd, TIMER_CB, TIMER_TICK, NULL);
        if(ret == 0)
            MessageBox(hwnd, "Could not set timer", "ERROR", MB_OK|MB_ICONEXCLAMATION);

        hStaticName = CreateWindowEx(0,
                    WC_STATIC,
                    worker_getName(worker[index]),
                    WS_CHILD|WS_VISIBLE,
                    150, 44, 130, 23,
                    hwnd,
                    (HMENU)STATIC_NAME,
                    hInst,
                    NULL);

        hStaticSurname = CreateWindowEx(0,
                    WC_STATIC,
                    worker_getSurname(worker[index]),
                    WS_CHILD|WS_VISIBLE,
                    150, 68, 130, 23,
                    hwnd,
                    (HMENU)STATIC_SURNAME,
                    hInst,
                    NULL);

        hStaticExp = CreateWindowEx(0,
                    WC_STATIC,
                    itoa(worker_getExp(worker[index]), buffer, 10),
                    WS_CHILD|WS_VISIBLE,
                    150, 92, 130, 23,
                    hwnd,
                    (HMENU)STATIC_EXP,
                    hInst,
                    NULL);

        hStaticSalar = CreateWindowEx(0,
                    WC_STATIC,
                    itoa(worker_getSalary(worker[index]), buffer, 10),
                    WS_CHILD|WS_VISIBLE,
                    150, 116, 130, 23,
                    hwnd,
                    (HMENU)STATIC_SALARY,
                    hInst,
                    NULL);

        break;
    case WM_TIMER:
        {
            int checked = IsDlgButtonChecked(hwnd, TIMER_CB);
            if(checked)
            {
                tick++;
                sprintf(buffer, "%i", tick);

                HWND hIndex = GetDlgItem(hwnd, LABLE_ID);
                SendMessage(hIndex, WM_SETTEXT, (WPARAM)256, (LPARAM)buffer);
            }
        }
        break;
    case WM_COMMAND:
        {
            switch(LOWORD(wParam))
            {
            case BUTTON_EX:
                {
                    for(int i = 0; i<WORKERS_COUNT; i++)
                    worker_free(worker[i]);

                    DestroyWindow(hwnd);
                    break;
                }
            }

            break;
        }
    case WM_CLOSE:

        for(int i = 0; i<WORKERS_COUNT; i++)
            worker_free(worker[i]);

        DestroyWindow(hwnd);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}