1

異なるコンピューターで実行されているいくつかのプロセスで構成されるプロジェクトがあります。これは「OS シミュレーター」に似ており、主にタスクのスケジューリングとリソースの割り当てです。

「プラットフォーム」または「サーバー」というメイン プロセスがあり、実行の準備ができている利用可能なプロセスを含むキューを使用して、それに接続するさまざまなプロセスを計画/スケジュールします。

ただし、時間が経過すると、ポインターはそれらの一部のメモリアドレス、またはそれへの参照を失うか、ポインタが指すメモリが解放されるか、他の変数に使用されます。これにより、実行されるはずのプロセスが停止し、プラットフォームがスケジュールするのを待つだけになります。これは、キューの要素がプロセス (ファイル記述子で処理する) を参照しなくなるため、決して起こりません。これを防ぐ方法はありますか??

問題があると思われるコードの部分は次のとおりです。

response = string_substring_from(response, sizeof(FREERESC));

char** data = string_split(response, COMA);

t_queue *temporaryQueue = queue_create();
t_scheduler_queue *queues = dictionary_get(levels_queues, data[0]);

pthread_mutex_lock(queues->mutex);

t_queue *anotherQueue = queue_create();

long o = 0;

if (queue_size(queues->character_queue) > 0)
{
    log_info(log, "Mas de un personaje listo");

    for (o = 0; o < queue_size(queues->character_queue); o++)
    {
        personaje_planificador *personajeEnLista = queue_pop(
        queues->character_queue);
        personaje_planificador *nuevoPersonaje = (personaje_planificador*) malloc(sizeof(personaje_planificador));
        // long *hola = (long*) malloc(sizeof(long));
        // memcpy(hola, &(personajeEnLista->fd), sizeof(long));
        // nuevoPersonaje->fd = hola;
        nuevoPersonaje->fd = personajeEnLista->fd;
        nuevoPersonaje->nombre = string_from_format("%s", personajeEnLista->nombre);
        queue_push(anotherQueue, nuevoPersonaje);
    }
}

char** simbolos;

long j = 2;
t_dictionary *recursosDisponibles = dictionary_create();

for (j = 2; j < list_size(queues->simbolos) + 2; j++)
{
    simbolos = string_split(data[j], DOSPUNTOS);
    long *temporary = (long*) malloc(sizeof(long));
    *temporary = atoi(simbolos[1]);
    dictionary_put(recursosDisponibles, simbolos[0], temporary);
}

if (queue_size(queues->blocked_queue) > 0)
{
    log_info(log, "Mas de un personaje bloqueado");

    long i = 0;
    long k = 0;
    for (i = 0; i < queue_size(queues->blocked_queue); i++)
    {
        blocked_character *blockedCharacter = queue_pop(queues->blocked_queue);

        for (k = 0; k < list_size(queues->simbolos); k++)
        {
            if (blockedCharacter->recurso == ((char*) list_get(queues->simbolos, k))[0])
            {
                if (giveResource(queues, dictionary_get(recursosDisponibles, list_get(queues->simbolos, k)), blockedCharacter) == 1)
                {
                    personaje_planificador *nuevoPersonajeAgain = (personaje_planificador*) malloc(sizeof(personaje_planificador));
                    nuevoPersonajeAgain->fd =
                    blockedCharacter->personaje->fd;
                    nuevoPersonajeAgain->nombre = blockedCharacter->personaje->nombre;
                    queue_push(temporaryQueue, nuevoPersonajeAgain);

                    //TODO log
                }
                else
                {
                    queue_push(queues->blocked_queue, blockedCharacter);
                }
            }
        }

        k = 0;
    }
}

o = 0;

for (o = 0; o < queue_size(temporaryQueue); o++)
{
    queue_push(anotherQueue, queue_pop(temporaryQueue));
}

queues->character_queue = anotherQueue;

pthread_mutex_unlock(queues->mutex);

t_level_address *addresses = (t_level_address*) dictionary_get(levelsMap, data[0]);

char **levelSocket = string_split(addresses->nivel, DOSPUNTOS);

long fdNivel = openSocketClient(levelSocket[1], levelSocket[0]);

sendMessage(fdNivel, stringRecursos(queues->simbolos, recursosDisponibles, atoi(data[1])));

free(recursosDisponibles);

log_info(log, "Liberar recursos.");

if (flagTerminoUnPersonaje == TRUE)
{
    executeKoopa(niveles, levels_queues, orquestador_config);
}

コードの一部が不明確な場合 (スペイン語で書かれているものがある場合)、または問題があると思われる別の部分が必要な場合はお知らせください。

4

1 に答える 1