blob: 1289ba2f9808d0ffb7b9776926c5d9efa1d3b58c [file] [log] [blame]
/*******************************************************************************
* 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
}