Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2188 → Rev 2187

/trunk/uspace/tester/thread/thread1.def
File deleted
/trunk/uspace/tester/thread/thread1.c
File deleted
/trunk/uspace/tester/print/print1.c
File deleted
/trunk/uspace/tester/print/print1.def
File deleted
/trunk/uspace/tester/tester.h
File deleted
/trunk/uspace/tester/ipc/connect.c
File deleted
/trunk/uspace/tester/ipc/register.def
File deleted
/trunk/uspace/tester/ipc/register.c
File deleted
/trunk/uspace/tester/ipc/connect.def
File deleted
/trunk/uspace/tester/tester.c
1,6 → 1,5
/*
* Copyright (c) 2006 Ondrej Palkovsky
* Copyright (c) 2007 Martin Decky
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
27,8 → 26,8
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
 
/** @addtogroup tester User space Tester
* @brief User space testing infrastructure.
/** @addtogroup ippc IPC Tester
* @brief IPC tester and task faulter.
* @{
*/
/**
35,81 → 34,247
* @file
*/
 
#include <unistd.h>
#include <stdio.h>
#include "tester.h"
#include <async.h>
#include <ipc/ipc.h>
#include <ipc/services.h>
#include <errno.h>
 
int myservice = 0;
int phones[MAX_PHONES];
int connections[MAX_CONNECTIONS];
ipc_callid_t callids[MAX_CONNECTIONS];
#define TEST_START 10000
#define MAXLIST 4
 
test_t tests[] = {
#include "thread/thread1.def"
#include "print/print1.def"
#include "ipc/register.def"
#include "ipc/connect.def"
{NULL, NULL, NULL}
};
#define MSG_HANG_ME_UP 2000
 
static bool run_test(test_t *test)
static int connections[50];
static ipc_callid_t callids[50];
static int phones[20];
static int myservice = 0;
 
static void client_connection(ipc_callid_t iid, ipc_call_t *icall)
{
printf("%s\t\t%s\n", test->name, test->desc);
ipc_callid_t callid;
ipc_call_t call;
ipcarg_t phonehash = icall->in_phone_hash;
int retval;
int i;
 
printf("Connected phone: %P, accepting\n", icall->in_phone_hash);
ipc_answer_fast(iid, 0, 0, 0);
for (i=0;i < 1024;i++)
if (!connections[i]) {
connections[i] = phonehash;
break;
}
/* Execute the test */
char * ret = test->entry(false);
if (ret == NULL) {
printf("Test passed\n\n");
return true;
while (1) {
callid = async_get_call(&call);
switch (IPC_GET_METHOD(call)) {
case IPC_M_PHONE_HUNGUP:
printf("Phone (%P) hung up.\n", phonehash);
retval = 0;
break;
default:
printf("Received message from %P: %X\n", phonehash,callid);
for (i = 0; i < 1024; i++)
if (!callids[i]) {
callids[i] = callid;
break;
}
continue;
}
ipc_answer_fast(callid, retval, 0, 0);
}
}
 
printf("%s\n\n", ret);
return false;
static void printhelp(void)
{
printf("? - help\n");
printf("c - connect to other service\n");
printf("h - hangup connection\n");
printf("a - send async message to other service\n");
printf("s - send sync message to other service\n");
printf("d - answer message that we have received\n");
printf("j - jump to endless loop\n");
printf("p - page fault\n");
printf("u - unaligned read\n");
}
 
static void run_safe_tests(void)
static void callback(void *private, int retval, ipc_call_t *data)
{
printf("Received response to msg %d - retval: %d.\n", private,
retval);
}
 
static void list_tests(void)
static void do_answer_msg(void)
{
test_t *test;
char c = 'a';
int i,cnt, errn = 0;
char c;
 
cnt = 0;
for (i = 0;i < 50; i++) {
if (callids[i]) {
printf("%d: %P\n", cnt, callids[i]);
cnt++;
}
if (cnt >= 10)
break;
}
if (!cnt)
return;
printf("Choose message:\n");
do {
c = getchar();
} while (c < '0' || (c-'0') >= cnt);
cnt = c - '0' + 1;
for (test = tests; test->name != NULL; test++, c++)
printf("%c\t%s\t\t%s%s\n", c, test->name, test->desc, (test->safe ? "" : " (unsafe)"));
for (i = 0; cnt; i++)
if (callids[i])
cnt--;
i -= 1;
 
printf("Normal (n) or hangup (h) or error(e) message?\n");
do {
c = getchar();
} while (c != 'n' && c != 'h' && c != 'e');
if (c == 'n')
errn = 0;
else if (c == 'h')
errn = EHANGUP;
else if (c == 'e')
errn = ENOENT;
printf("Answering %P\n", callids[i]);
ipc_answer_fast(callids[i], errn, 0, 0);
callids[i] = 0;
}
 
static void do_send_msg(int async)
{
int phoneid;
int res;
static int msgid = 1;
char c;
 
printf("Select phoneid to send msg: 2-9\n");
do {
c = getchar();
} while (c < '2' || c > '9');
phoneid = c - '0';
 
if (async) {
ipc_call_async(phoneid, 2000, 0, (void *)msgid, callback, 1);
printf("Async sent - msg %d\n", msgid);
msgid++;
} else {
printf("Sending msg...");
res = ipc_call_sync_2(phoneid, 2000, 0, 0, NULL, NULL);
printf("done: %d\n", res);
}
}
 
static void do_hangup(void)
{
char c;
int res;
int phoneid;
 
printf("Select phoneid to hangup: 2-9\n");
do {
c = getchar();
} while (c < '2' || c > '9');
phoneid = c - '0';
printf("*\t\t\tRun all safe tests\n");
printf("Hanging up...");
res = ipc_hangup(phoneid);
printf("done: %d\n", phoneid);
}
 
static void do_connect(void)
{
char c;
int svc;
int phid;
 
printf("Choose one service: 0:10000....9:10009\n");
do {
c = getchar();
} while (c < '0' || c > '9');
svc = TEST_START + c - '0';
if (svc == myservice) {
printf("Currently cannot connect to myself, update test\n");
return;
}
printf("Connecting to %d..", svc);
phid = ipc_connect_me_to(PHONE_NS, svc, 0);
if (phid > 0) {
printf("phoneid: %d\n", phid);
phones[phid] = 1;
} else
printf("error: %d\n", phid);
}
 
int main(void)
{
ipcarg_t phonead;
int i;
char c;
int res;
volatile long long var;
volatile int var1;
printf("********************************\n");
printf("***********IPC Tester***********\n");
printf("********************************\n");
async_set_client_connection(client_connection);
 
for (i = TEST_START; i < TEST_START + 10; i++) {
res = ipc_connect_to_me(PHONE_NS, i, 0, &phonead);
if (!res)
break;
printf("Failed registering as %d..:%d\n", i, res);
}
printf("Registered as service: %d\n", i);
myservice = i;
 
printhelp();
while (1) {
char c;
test_t *test;
list_tests();
printf("> ");
c = getchar();
printf("%c\n", c);
if ((c >= 'a') && (c <= 'z')) {
for (test = tests; test->name != NULL; test++, c--)
if (c == 'a')
break;
if (c > 'a')
printf("Unknown test\n\n");
else
run_test(test);
} else if (c == '*')
run_safe_tests();
else
printf("Invalid test\n\n");
switch (c) {
case '?':
printhelp();
break;
case 'h':
do_hangup();
break;
case 'c':
do_connect();
break;
case 'a':
do_send_msg(1);
break;
case 's':
do_send_msg(0);
break;
case 'd':
do_answer_msg();
break;
case 'j':
printf("Entering infinite loop\n");
while (1)
;
break;
case 'p':
printf("Doing page fault\n");
*((char *)0) = 1;
printf("done\n");
break;
case 'u':
var1=*( (int *) ( ( (char *)(&var) ) + 1 ) );
break;
}
}
}
 
/** @}
*/
 
/trunk/uspace/tester/Makefile
41,11 → 41,7
#
 
OUTPUT = tester
SOURCES = tester.c \
thread/thread1.c \
print/print1.c \
ipc/register.c \
ipc/connect.c
SOURCES = tester.c
 
OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
 
/trunk/uspace/libc/include/unistd.h
44,9 → 44,8
extern ssize_t write(int fd, const void * buf, size_t count);
extern ssize_t read(int fd, void * buf, size_t count);
extern void _exit(int status);
extern void *sbrk(ssize_t incr);
extern void usleep(unsigned long usec);
extern unsigned int sleep(unsigned int seconds);
void *sbrk(ssize_t incr);
void usleep(unsigned long usec);
 
#endif
 
/trunk/uspace/libc/include/thread.h
44,9 → 44,6
 
extern int thread_create(void (* function)(void *arg), void *arg, char *name);
extern void thread_exit(int status);
extern void thread_detach(int thread);
extern int thread_join(int thread);
extern int thread_get_id(void);
extern tcb_t * __make_tls(void);
extern tcb_t * __alloc_tls(void **data, size_t size);
extern void __free_tls(tcb_t *);
/trunk/uspace/libc/generic/time.c
108,31 → 108,14
return 0;
}
 
/** Wait unconditionally for specified number of microseconds */
/** Wait unconditionally for specified microseconds */
void usleep(unsigned long usec)
{
atomic_t futex = FUTEX_INITIALIZER;
 
futex_initialize(&futex, 0);
futex_initialize(&futex,0);
futex_down_timeout(&futex, usec, 0);
}
 
/** Wait unconditionally for specified number of seconds */
unsigned int sleep(unsigned int seconds)
{
atomic_t futex = FUTEX_INITIALIZER;
 
futex_initialize(&futex, 0);
/* Sleep in 1000 second steps to support
full argument range */
while (seconds > 0) {
unsigned int period = (seconds > 1000) ? 1000 : seconds;
futex_down_timeout(&futex, period * 1000000, 0);
seconds -= period;
}
}
 
/** @}
*/
/trunk/uspace/libc/generic/thread.c
160,36 → 160,5
__SYSCALL1(SYS_THREAD_EXIT, (sysarg_t) status);
}
 
/** Detach thread.
*
* Currently not implemented.
*
* @param thread TID.
*/
void thread_detach(int thread)
{
}
 
/** Join thread.
*
* Currently not implemented.
*
* @param thread TID.
*
* @return Thread exit status.
*/
int thread_join(int thread)
{
}
 
/** Get current thread ID.
*
* @return Current thread ID.
*/
int thread_get_id(void)
{
return __SYSCALL0(SYS_THREAD_GET_ID);
}
 
/** @}
*/