/*
* Copyright (c) 2007 Jan Hudecek
* Copyright (c) 2005 Jakub Jermar
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <print.h>
#include <arch.h>
#include <test.h>
#include <proc/tasklet.h>
#include <synch/waitq.h>
#include <cpu.h>
#include <proc/thread.h>
#include <arch/types.h>
#include <config.h>
bool gquiet;
static void func(void *data)
{
if (!gquiet)
printf("cpu%d: %s",CPU
->id
, data
);
}
#ifdef CONFIG_SMP
static void running_tasklet(void * data)
{
waitq_t wq;
waitq_initialize(&wq);
tasklet_descriptor_t *tasklet_desc;
//before we start we need to register a tasklet
if (!gquiet)
printf("cpu:%d, Registering tasklet...", CPU
->id
);
if (!gquiet)
tasklet_desc=tasklet_register(&func, "\nTasklet called and received data\n");
else
tasklet_desc=tasklet_register(&func, "");
if (!gquiet)
//first we'll try disabling the tasklet
if (!gquiet)
printf("cpu:%d, Disabling tasklet...", CPU
->id
);
tasklet_disable(tasklet_desc);
if (!gquiet)
//we'll schedule the disabled tasklet
if (!gquiet)
printf("cpu:%d, Scheduling tasklet...", CPU
->id
);
tasklet_schedule(tasklet_desc);
if (!gquiet)
//and we'll wait if it gets called. It shouldn't however, because it's disabled
if (!gquiet)
printf("cpu:%d, Waiting 1s...\n", CPU
->id
);
waitq_sleep_timeout(&wq,(uint32_t) 1000000,0);
if (!gquiet)
printf("cpu:%d, Done!\n", CPU
->id
);
//then we'll try to enable it
if (!gquiet)
printf("cpu:%d, Enabling tasklet...", CPU
->id
);
tasklet_enable(tasklet_desc);
if (!gquiet)
//and wait if it gets called this time. It should because it's enabled
if (!gquiet)
printf("cpu:%d, Waiting 1s...\n", CPU
->id
);
waitq_sleep_timeout(&wq,(uint32_t) 1000000,0);
if (!gquiet)
printf("cpu:%d, Done!\n", CPU
->id
);
//finally we'll free the tasklet structure
if (!gquiet)
printf("cpu:%d, Freeing...", CPU
->id
);
tasklet_free(tasklet_desc);
if (!gquiet)
}
#endif
char * test_tasklet1(bool quiet)
{
gquiet = quiet;
waitq_t wq;
waitq_initialize(&wq);
tasklet_descriptor_t *tasklet_desc;
#ifdef CONFIG_SMP
thread_t* second_thread = NULL;
if (!quiet)
printf("cpus:%d\n", config.
cpu_active);
if (config.cpu_active >1) {
second_thread = thread_create(&running_tasklet, NULL, TASK, THREAD_FLAG_WIRED,"running tasklet", false);
if (CPU->id == 0)
second_thread->cpu = &cpus[1];
else
second_thread->cpu = &cpus[0];
thread_ready(second_thread);
}
#endif
//before we start we need to register a tasklet
if (!quiet)
printf("cpu:%d, Registering tasklet...", CPU
->id
);
if (!quiet)
tasklet_desc=tasklet_register(&func, "\nTasklet called and received data\n");
else
tasklet_desc=tasklet_register(&func, "");
if (!quiet)
//first we'll try disabling the tasklet
if (!quiet)
printf("cpu:%d, Disabling tasklet...", CPU
->id
);
tasklet_disable(tasklet_desc);
if (!quiet)
//we'll schedule the disabled tasklet
if (!quiet)
printf("cpu:%d, Scheduling tasklet...", CPU
->id
);
tasklet_schedule(tasklet_desc);
if (!quiet)
//and we'll wait if it gets called. It shouldn't however, because it's disabled
if (!quiet)
printf("cpu:%d, Waiting 1s...\n", CPU
->id
);
waitq_sleep_timeout(&wq,(uint32_t) 1000000,0);
if (!quiet)
printf("cpu:%d, Done!\n", CPU
->id
);
//then we'll try to enable it
if (!quiet)
printf("cpu:%d, Enabling tasklet...", CPU
->id
);
tasklet_enable(tasklet_desc);
if (!quiet)
//and wait if it gets called this time. It should because it's enabled
if (!quiet)
printf("cpu:%d, Waiting 1s...\n", CPU
->id
);
waitq_sleep_timeout(&wq,(uint32_t) 1000000,0);
if (!quiet)
printf("cpu:%d, Done!\n", CPU
->id
);
#ifdef CONFIG_SMP
if (config.cpu_active >1) {
printf("Joining with the second thread...");
thread_join(second_thread);
}
#endif
//finally we'll free the tasklet structure
if (!quiet)
printf("cpu:%d, Freeing...", CPU
->id
);
tasklet_free(tasklet_desc);
if (!quiet)
return NULL;
}