/*******************************************************************************
 * Copyright (c) 2007 Wind River Systems, Inc. and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License v1.0 
 * which accompanies this distribution, and is available at 
 * http://www.eclipse.org/legal/epl-v10.html 
 *  
 * Contributors:
 *     Wind River Systems - initial API and implementation
 *******************************************************************************/

/*
 * Agent self-testing service.
 */

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <assert.h>
#include "myalloc.h"
#include "mdep.h"
#include "test.h"
#include "trace.h"
#include "context.h"

void tcf_test_func2(void) {
    usleep(1000);
}

void tcf_test_func1(void) {
    tcf_test_func2();
}

void tcf_test_func0(void) {
    tcf_test_func1();
}

char * tcf_test_array = NULL;

static void * test_sub(void * x) {
    volatile int * test_done = (int *)x;
    while (!*test_done) {
        tcf_test_func0();
    }
    return NULL;
}

static void test_proc(void) {
    int i;
    pthread_t thread[4];
    int test_done = 0;
    for (i = 0; i < 4; i++) {
        thread[i] = 0;
    }
    for (i = 0; i < 4; i++) {
        if (pthread_create(thread + i, &pthread_create_attr, test_sub, &test_done) != 0) {
            perror("pthread_create");
            break;
        }
    }
    for (i = 0; i < 10; i++) {
        tcf_test_func0();
    }
    test_done = 1;
    for (i = 0; i < 4; i++) {
        if (thread[i]) pthread_join(thread[i], NULL);
    }
}

int run_test_process(pid_t * res) {
#if defined(WIN32)
    errno = EINVAL;
    return -1;
#elif defined(_WRS_KERNEL)
    int tid = taskCreate("tTcf", 100, 0, 0x4000, (FUNCPTR)test_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    if (tid == 0) return -1;
    taskStop(tid);
    taskActivate(tid);
    assert(taskIsStopped(tid));
    if (tcf_test_array == NULL) tcf_test_array = loc_alloc(0x1000);
    if (res != NULL) *res = tid;
    return context_attach(tid, NULL);
#else
    /* Create child process to debug */
    Context * ctx = NULL;
    int pid = fork();
    if (pid < 0) return -1;
    if (pid == 0) {
        tcf_test_array = loc_alloc(0x1000);
        tkill(getpid(), SIGSTOP);
        test_proc();
        exit(0);
    }
    if (res != NULL) *res = pid;
    if (context_attach(pid, &ctx) < 0) return -1;
    ctx->pending_intercept = 1;
    return 0;
#endif
}

