processes_arrived_sofar--;
if (!processes_arrived_sofar) {
- simcall_cond_destroy(cond);
- simcall_mutex_destroy(mutex);
+ SIMIX_cond_destroy(cond);
+ SIMIX_mutex_destroy(mutex);
mutex = NULL;
}
}
/************************** Synchro simcalls **********************************/
XBT_PUBLIC(smx_mutex_t) simcall_mutex_init(void);
-XBT_PUBLIC(void) simcall_mutex_destroy(smx_mutex_t mutex);
+XBT_PUBLIC(void) SIMIX_mutex_destroy(smx_mutex_t mutex);
XBT_PUBLIC(void) simcall_mutex_lock(smx_mutex_t mutex);
XBT_PUBLIC(int) simcall_mutex_trylock(smx_mutex_t mutex);
XBT_PUBLIC(void) simcall_mutex_unlock(smx_mutex_t mutex);
XBT_PUBLIC(smx_cond_t) simcall_cond_init(void);
-XBT_PUBLIC(void) simcall_cond_destroy(smx_cond_t cond);
+XBT_PUBLIC(void) SIMIX_cond_destroy(smx_cond_t cond);
XBT_PUBLIC(void) simcall_cond_signal(smx_cond_t cond);
XBT_PUBLIC(void) simcall_cond_wait(smx_cond_t cond, smx_mutex_t mutex);
XBT_PUBLIC(void) simcall_cond_wait_timeout(smx_cond_t cond,
XBT_PUBLIC(void) simcall_cond_broadcast(smx_cond_t cond);
XBT_PUBLIC(smx_sem_t) simcall_sem_init(int capacity);
-XBT_PUBLIC(void) simcall_sem_destroy(smx_sem_t sem);
+XBT_PUBLIC(void) SIMIX_sem_destroy(smx_sem_t sem);
XBT_PUBLIC(void) simcall_sem_release(smx_sem_t sem);
XBT_PUBLIC(int) simcall_sem_would_block(smx_sem_t sem);
XBT_PUBLIC(void) simcall_sem_acquire(smx_sem_t sem);
}
void MSG_sem_destroy(msg_sem_t sem) {
- simcall_sem_destroy(sem);
+ SIMIX_sem_destroy(sem);
}
/** @brief returns a boolean indicating if this semaphore would block at this very specific time
*
return simcall_BODY_mutex_init();
}
-/**
- * \ingroup simix_synchro_management
- *
- */
-void simcall_mutex_destroy(smx_mutex_t mutex)
-{
- simcall_BODY_mutex_destroy(mutex);
-}
-
/**
* \ingroup simix_synchro_management
*
return simcall_BODY_cond_init();
}
-/**
- * \ingroup simix_synchro_management
- *
- */
-void simcall_cond_destroy(smx_cond_t cond)
-{
- simcall_BODY_cond_destroy(cond);
-}
-
/**
* \ingroup simix_synchro_management
*
return simcall_BODY_sem_init(capacity);
}
-/**
- * \ingroup simix_synchro_management
- *
- */
-void simcall_sem_destroy(smx_sem_t sem)
-{
- simcall_BODY_sem_destroy(sem);
-}
-
/**
* \ingroup simix_synchro_management
*
simcall->result.dp = result;
}
-static inline smx_mutex_t simcall_mutex_destroy__get__mutex(smx_simcall_t simcall) {
- return (smx_mutex_t) simcall->args[0].dp;
-}
-static inline void simcall_mutex_destroy__set__mutex(smx_simcall_t simcall, void* arg) {
- simcall->args[0].dp = arg;
-}
-
static inline smx_mutex_t simcall_mutex_lock__get__mutex(smx_simcall_t simcall) {
return (smx_mutex_t) simcall->args[0].dp;
}
simcall->result.dp = result;
}
-static inline smx_cond_t simcall_cond_destroy__get__cond(smx_simcall_t simcall) {
- return (smx_cond_t) simcall->args[0].dp;
-}
-static inline void simcall_cond_destroy__set__cond(smx_simcall_t simcall, void* arg) {
- simcall->args[0].dp = arg;
-}
-
static inline smx_cond_t simcall_cond_signal__get__cond(smx_simcall_t simcall) {
return (smx_cond_t) simcall->args[0].dp;
}
simcall->result.dp = result;
}
-static inline smx_sem_t simcall_sem_destroy__get__sem(smx_simcall_t simcall) {
- return (smx_sem_t) simcall->args[0].dp;
-}
-static inline void simcall_sem_destroy__set__sem(smx_simcall_t simcall, void* arg) {
- simcall->args[0].dp = arg;
-}
-
static inline smx_sem_t simcall_sem_release__get__sem(smx_simcall_t simcall) {
return (smx_sem_t) simcall->args[0].dp;
}
return (smx_mutex_t) self->simcall.result.dp;
}
-inline static void simcall_BODY_mutex_destroy(smx_mutex_t mutex) {
- smx_process_t self = SIMIX_process_self();
-
- /* Go to that function to follow the code flow through the simcall barrier */
- if (0) SIMIX_mutex_destroy(mutex);
- /* end of the guide intended to the poor programmer wanting to go from MSG to Surf */
-
- self->simcall.call = SIMCALL_MUTEX_DESTROY;
- memset(&self->simcall.result, 0, sizeof(self->simcall.result));
- memset(self->simcall.args, 0, sizeof(self->simcall.args));
- self->simcall.args[0].dp = (void*) mutex;
- if (self != simix_global->maestro_process) {
- XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
- SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
- SIMIX_process_yield(self);
- } else {
- SIMIX_simcall_handle(&self->simcall, 0);
- }
-
- }
-
inline static void simcall_BODY_mutex_lock(smx_mutex_t mutex) {
smx_process_t self = SIMIX_process_self();
return (smx_cond_t) self->simcall.result.dp;
}
-inline static void simcall_BODY_cond_destroy(smx_cond_t cond) {
- smx_process_t self = SIMIX_process_self();
-
- /* Go to that function to follow the code flow through the simcall barrier */
- if (0) SIMIX_cond_destroy(cond);
- /* end of the guide intended to the poor programmer wanting to go from MSG to Surf */
-
- self->simcall.call = SIMCALL_COND_DESTROY;
- memset(&self->simcall.result, 0, sizeof(self->simcall.result));
- memset(self->simcall.args, 0, sizeof(self->simcall.args));
- self->simcall.args[0].dp = (void*) cond;
- if (self != simix_global->maestro_process) {
- XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
- SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
- SIMIX_process_yield(self);
- } else {
- SIMIX_simcall_handle(&self->simcall, 0);
- }
-
- }
-
inline static void simcall_BODY_cond_signal(smx_cond_t cond) {
smx_process_t self = SIMIX_process_self();
return (smx_sem_t) self->simcall.result.dp;
}
-inline static void simcall_BODY_sem_destroy(smx_sem_t sem) {
- smx_process_t self = SIMIX_process_self();
-
- /* Go to that function to follow the code flow through the simcall barrier */
- if (0) SIMIX_sem_destroy(sem);
- /* end of the guide intended to the poor programmer wanting to go from MSG to Surf */
-
- self->simcall.call = SIMCALL_SEM_DESTROY;
- memset(&self->simcall.result, 0, sizeof(self->simcall.result));
- memset(self->simcall.args, 0, sizeof(self->simcall.args));
- self->simcall.args[0].dp = (void*) sem;
- if (self != simix_global->maestro_process) {
- XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
- SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
- SIMIX_process_yield(self);
- } else {
- SIMIX_simcall_handle(&self->simcall, 0);
- }
-
- }
-
inline static void simcall_BODY_sem_release(smx_sem_t sem) {
smx_process_t self = SIMIX_process_self();
SIMCALL_COMM_GET_SRC_PROC,
SIMCALL_COMM_GET_DST_PROC,
SIMCALL_MUTEX_INIT,
- SIMCALL_MUTEX_DESTROY,
SIMCALL_MUTEX_LOCK,
SIMCALL_MUTEX_TRYLOCK,
SIMCALL_MUTEX_UNLOCK,
SIMCALL_COND_INIT,
- SIMCALL_COND_DESTROY,
SIMCALL_COND_SIGNAL,
SIMCALL_COND_WAIT,
SIMCALL_COND_WAIT_TIMEOUT,
SIMCALL_COND_BROADCAST,
SIMCALL_SEM_INIT,
- SIMCALL_SEM_DESTROY,
SIMCALL_SEM_RELEASE,
SIMCALL_SEM_WOULD_BLOCK,
SIMCALL_SEM_ACQUIRE,
"SIMCALL_COMM_GET_SRC_PROC",
"SIMCALL_COMM_GET_DST_PROC",
"SIMCALL_MUTEX_INIT",
- "SIMCALL_MUTEX_DESTROY",
"SIMCALL_MUTEX_LOCK",
"SIMCALL_MUTEX_TRYLOCK",
"SIMCALL_MUTEX_UNLOCK",
"SIMCALL_COND_INIT",
- "SIMCALL_COND_DESTROY",
"SIMCALL_COND_SIGNAL",
"SIMCALL_COND_WAIT",
"SIMCALL_COND_WAIT_TIMEOUT",
"SIMCALL_COND_BROADCAST",
"SIMCALL_SEM_INIT",
- "SIMCALL_SEM_DESTROY",
"SIMCALL_SEM_RELEASE",
"SIMCALL_SEM_WOULD_BLOCK",
"SIMCALL_SEM_ACQUIRE",
SIMIX_simcall_answer(simcall);
break;
-case SIMCALL_MUTEX_DESTROY:
- SIMIX_mutex_destroy((smx_mutex_t) simcall->args[0].dp);
- SIMIX_simcall_answer(simcall);
- break;
-
case SIMCALL_MUTEX_LOCK:
simcall_HANDLER_mutex_lock(simcall , (smx_mutex_t) simcall->args[0].dp);
break;
SIMIX_simcall_answer(simcall);
break;
-case SIMCALL_COND_DESTROY:
- SIMIX_cond_destroy((smx_cond_t) simcall->args[0].dp);
- SIMIX_simcall_answer(simcall);
- break;
-
case SIMCALL_COND_SIGNAL:
SIMIX_cond_signal((smx_cond_t) simcall->args[0].dp);
SIMIX_simcall_answer(simcall);
SIMIX_simcall_answer(simcall);
break;
-case SIMCALL_SEM_DESTROY:
- SIMIX_sem_destroy((smx_sem_t) simcall->args[0].dp);
- SIMIX_simcall_answer(simcall);
- break;
-
case SIMCALL_SEM_RELEASE:
simcall_HANDLER_sem_release(simcall , (smx_sem_t) simcall->args[0].dp);
SIMIX_simcall_answer(simcall);
Func - comm_get_dst_proc (void*, smx_process_t) (comm, void*, smx_synchro_t)
Func H mutex_init (void*, smx_mutex_t)
-Proc - mutex_destroy (void) (mutex, void*, smx_mutex_t)
Blck H mutex_lock (void) (mutex, void*, smx_mutex_t)
Func H mutex_trylock (int) (mutex, void*, smx_mutex_t)
Proc H mutex_unlock (void) (mutex, void*, smx_mutex_t)
Func - cond_init (void*, smx_cond_t)
-Proc - cond_destroy (void) (cond, void*, smx_cond_t)
Proc - cond_signal (void) (cond, void*, smx_cond_t)
Blck H cond_wait (void) (cond, void*, smx_cond_t) (mutex, void*, smx_mutex_t)
Blck H cond_wait_timeout (void) (cond, void*, smx_cond_t) (mutex, void*, smx_mutex_t) (timeout, double)
Proc - cond_broadcast (void) (cond, void*, smx_cond_t)
Func - sem_init (void*, smx_sem_t) (capacity, unsigned int)
-Proc - sem_destroy (void) (sem, void*, smx_sem_t)
Proc H sem_release (void) (sem, void*, smx_sem_t)
Func H sem_would_block (int) (sem, void*, smx_sem_t)
Blck H sem_acquire (void) (sem, void*, smx_sem_t)
maestro->context = SIMIX_context_new(NULL, 0, NULL, NULL, maestro);
maestro->simcall.issuer = maestro;
simix_global->maestro_process = maestro;
- return;
}
/**
* \brief Stops a process.
XBT_PRIVATE void SIMIX_synchro_destroy(smx_synchro_t synchro);
XBT_PRIVATE smx_mutex_t SIMIX_mutex_init(void);
-XBT_PRIVATE void SIMIX_mutex_destroy(smx_mutex_t mutex);
XBT_PRIVATE int SIMIX_mutex_trylock(smx_mutex_t mutex, smx_process_t issuer);
XBT_PRIVATE void SIMIX_mutex_unlock(smx_mutex_t mutex, smx_process_t issuer);
XBT_PRIVATE smx_cond_t SIMIX_cond_init(void);
-XBT_PRIVATE void SIMIX_cond_destroy(smx_cond_t cond);
XBT_PRIVATE void SIMIX_cond_broadcast(smx_cond_t cond);
XBT_PRIVATE void SIMIX_cond_signal(smx_cond_t cond);
-XBT_PRIVATE void SIMIX_sem_destroy(smx_sem_t sem);
XBT_PRIVATE XBT_PRIVATE smx_sem_t SIMIX_sem_init(unsigned int value);
XBT_PRIVATE void SIMIX_sem_release(smx_sem_t sem);
XBT_PRIVATE int SIMIX_sem_would_block(smx_sem_t sem);
void xbt_mutex_destroy(xbt_mutex_t mutex)
{
- simcall_mutex_destroy((smx_mutex_t) mutex);
+ SIMIX_mutex_destroy((smx_mutex_t) mutex);
}
/***** condition related functions *****/
void xbt_cond_destroy(xbt_cond_t cond)
{
- simcall_cond_destroy((smx_cond_t) cond);
+ SIMIX_cond_destroy((smx_cond_t) cond);
}
/***** barrier related functions *****/
xbt_os_thread_t xbt_os_thread_self(void)
{
- xbt_os_thread_t res;
-
if (!thread_mod_inited)
return NULL;
- res = pthread_getspecific(xbt_self_thread_key);
-
- return res;
+ return pthread_getspecific(xbt_self_thread_key);
}
void xbt_os_thread_key_create(xbt_os_thread_key_t* key) {
void *xbt_os_thread_get_extra_data(void)
{
- xbt_os_thread_t self = xbt_os_thread_self();
- return self? self->extra_data : NULL;
+ return xbt_os_thread_self()->extra_data;
}
xbt_os_rmutex_t xbt_os_rmutex_init(void)
--- /dev/null
+set(example java_semaphore_gc)
+set(sources
+ ${CMAKE_CURRENT_SOURCE_DIR}/SemaphoreGC.java
+ )
+
+if(enable_java)
+ add_custom_command(
+ COMMENT "Building ${example}..."
+ OUTPUT ${example}_compiled
+ DEPENDS ${sources} simgrid-java_jar ${SIMGRID_JAR}
+ COMMAND ${JAVA_COMPILE} -classpath ${SIMGRID_JAR}
+ -d ${CMAKE_CURRENT_BINARY_DIR}/.. ${sources}
+ COMMAND ${CMAKE_COMMAND} -E remove ${example}_compiled
+ COMMAND ${CMAKE_COMMAND} -E touch ${example}_compiled
+ )
+ add_custom_target(${example} ALL DEPENDS ${example}_compiled)
+endif()
+
+set(tesh_files
+ ${tesh_files}
+ ${CMAKE_CURRENT_SOURCE_DIR}/semaphore_gc.tesh
+ PARENT_SCOPE
+ )
+set(xml_files
+ ${xml_files}
+ PARENT_SCOPE
+ )
+set(examples_src
+ ${examples_src}
+ ${sources}
+ PARENT_SCOPE
+ )
+set(bin_files
+ ${bin_files}
+ PARENT_SCOPE
+ )
+set(txt_files
+ ${txt_files}
+ PARENT_SCOPE
+ )
--- /dev/null
+/* Copyright (c) 2016. The SimGrid Team. All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This test ensures that the used semaphores are not garbage-collected while we still use it.
+ * This was reported as bug #... on gforge.
+ */
+
+package semaphore;
+
+import org.simgrid.msg.*;
+import org.simgrid.msg.Process;
+import org.simgrid.trace.Trace;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+class SemCreator extends Process {
+ Semaphore sem;
+
+ SemCreator(Host h, String n){
+ super(h, n);
+ }
+
+ public void main(String[] args) throws MsgException{
+ int j;
+ Msg.info("Creating 150 new Semaphores, yielding and triggering a GC after each");
+ for(j = 1; j <= 150; j++) {
+ sem = new Semaphore(0);
+ waitFor(10);
+ System.gc();
+ }
+ Msg.info("It worked, we survived. The test is passed.");
+ }
+}
+
+
+public class SemaphoreGC {
+ public static void main(String[] args) throws Exception {
+
+ Msg.init(args);
+ if (args.length < 1) {
+ Msg.info("Usage: java -cp simgrid.jar:. semaphore.SemaphoreGC <deployment.xml>");
+ System.exit(1);
+ }
+ Msg.createEnvironment(args[0]);
+
+ Host[] hosts = Host.all();
+ new SemCreator(hosts[0], "SemCreator").start();
+
+ Msg.run();
+ }
+
+}
--- /dev/null
+$ java -classpath ${classpath:=.} semaphore.SemaphoreGC ${srcdir:=.}/../../examples/platforms/small_platform.xml "--log=root.fmt:[%10.4r]%e(%i:%P@%h)%e%m%n"
+> [ 0.0000] (0:maestro@) Using regular java threads.
+> [ 0.0000] (1:SemCreator@Fafard) Creating 150 new Semaphores, yielding and triggering a GC after each
+> [ 1500.0000] (1:SemCreator@Fafard) It worked, we survived. The test is passed.
+> [ 1500.0000] (0:maestro@) MSG_main finished; Cleaning up the simulation...
set(example java_sleep_host_off)
set(sources
- ${CMAKE_CURRENT_SOURCE_DIR}/Main.java
${CMAKE_CURRENT_SOURCE_DIR}/SleepHostOff.java
)
+++ /dev/null
-package sleep_host_off;
-
-import org.simgrid.msg.Host;
-import org.simgrid.msg.HostNotFoundException;
-import org.simgrid.msg.Msg;
-import org.simgrid.msg.NativeException;
-
-public class Main {
-
- public static void main(String[] args) throws NativeException {
- /* Init. internal values */
- Msg.init(args);
-
- if (args.length < 2) {
- Msg.info("Usage : Main platform_file.xml dployment_file.xml");
- System.exit(1);
- }
-
- /* construct the platform and deploy the application */
- Msg.createEnvironment(args[0]);
- Msg.deployApplication(args[1]);
-
- try {
- Msg.run();
- } catch (Exception e){
- System.out.println("Bye bye the program crashes !");
- }
-
- }
-}
import java.util.List;
import java.util.Random;
-public class SleepHostOff extends Process{
- public static Host jupiter = null;
-
- public SleepHostOff(Host host, String name, String[]args) {
- super(host,name,args);
- }
-
- public void main(String[] strings) throws MsgException {
-
- try {
- jupiter = Host.getByName("Jupiter");
- } catch (HostNotFoundException e) {
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
- }
-
- Msg.info("**** **** **** ***** ***** Test Sleep ***** ***** **** **** ****");
- Msg.info("Test sleep: Create a process on Jupiter, the process simply make periodic sleep, turn off Jupiter");
- new Process(jupiter, "sleep", null) {
- public void main(String[] args) {
- while (true) {
- Msg.info("I'm not dead");
- try {
- Process.sleep(10);
- } catch (HostFailureException e) {
- Msg.info("catch HostException: "+e.getLocalizedMessage());
- break; //Break is needed to finalize the endless loop
- }
- }
- }
- }.start();
-
- Process.sleep(20);
- Msg.info("Stop Jupiter");
- jupiter.off();
- Msg.info("Jupiter has been stopped");
- Process.sleep(300);
- Msg.info("Test sleep seems ok, cool !(number of Process : " + Process.getCount() + ", it should be 1 (i.e. the Test one))\n");
- }
+class Sleeper extends Process {
+ public Sleeper(Host host, String name, String[] args) {
+ super(host,name,args);
+ }
+ public void main(String[] args) {
+ while (true) {
+ Msg.info("I'm not dead");
+ try {
+ Process.sleep(10);
+ } catch (HostFailureException e) {
+ Msg.info("catch HostException: "+e.getLocalizedMessage());
+ break; //Break is needed to finalize the endless loop
+ }
+ }
+ }
+}
+
+class TestRunner extends Process {
+
+ public TestRunner(Host host, String name, String[] args) {
+ super(host,name,args);
+ }
+
+ public void main(String[] strings) throws MsgException {
+ Host host = Host.all()[1];
+
+
+ Msg.info("**** **** **** ***** ***** Test Sleep ***** ***** **** **** ****");
+ Msg.info("Test sleep: Create a process on "+host.getName()+" that simply make periodic sleep, turn off "+host.getName());
+ new Sleeper(host, "Sleeper", null).start();
+
+ waitFor(0.02);
+ Msg.info("Stop "+host.getName());
+ host.off();
+ Msg.info(host.getName()+" has been stopped");
+ waitFor(0.3);
+ Msg.info("Test sleep seems ok, cool! (number of Process : " + Process.getCount() + ", it should be 1 (i.e. the Test one))");
+ }
+}
+
+public class SleepHostOff {
+
+ public static void main(String[] args) throws Exception {
+ /* Init. internal values */
+ Msg.init(args);
+
+ if (args.length < 1) {
+ Msg.info("Usage: java -cp simgrid.jar:. sleep_host_off.SleepHostOff <platform.xml>");
+ System.exit(1);
+ }
+
+ /* construct the platform and deploy the application */
+ Msg.createEnvironment(args[0]);
+
+ Host[] hosts = Host.all();
+ new TestRunner(hosts[0], "TestRunner", null).start();
+
+ Msg.run();
+ }
}
-$ java -classpath ${classpath:=.} sleep_host_off.Main ${srcdir:=.}/../../examples/platforms/small_platform.xml ${srcdir:=.}/sleep_host_off/sleep_host_off_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+$ java -classpath ${classpath:=.} sleep_host_off.SleepHostOff ${srcdir:=.}/../../examples/platforms/small_platform.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
> [ 0.000000] (0:maestro@) Using regular java threads.
-> [ 0.000000] (1:sleep_host_off.SleepHostOff@Tremblay) **** **** **** ***** ***** Test Sleep ***** ***** **** **** ****
-> [ 0.000000] (1:sleep_host_off.SleepHostOff@Tremblay) Test sleep: Create a process on Jupiter, the process simply make periodic sleep, turn off Jupiter
-> [ 0.000000] (2:sleep@Jupiter) I'm not dead
-> [ 0.010000] (2:sleep@Jupiter) I'm not dead
-> [ 0.020000] (1:sleep_host_off.SleepHostOff@Tremblay) Stop Jupiter
-> [ 0.020000] (2:sleep@Jupiter) I'm not dead
-> [ 0.020000] (2:sleep@Jupiter) catch HostException: Host Failure (null)
-> [ 0.020000] (1:sleep_host_off.SleepHostOff@Tremblay) Jupiter has been stopped
-> [ 0.320000] (1:sleep_host_off.SleepHostOff@Tremblay) Test sleep seems ok, cool !(number of Process : 1, it should be 1 (i.e. the Test one))
->
+> [ 0.000000] (1:TestRunner@Fafard) **** **** **** ***** ***** Test Sleep ***** ***** **** **** ****
+> [ 0.000000] (1:TestRunner@Fafard) Test sleep: Create a process on Tremblay that simply make periodic sleep, turn off Tremblay
+> [ 0.000000] (2:Sleeper@Tremblay) I'm not dead
+> [ 0.010000] (2:Sleeper@Tremblay) I'm not dead
+> [ 0.020000] (1:TestRunner@Fafard) Stop Tremblay
+> [ 0.020000] (2:Sleeper@Tremblay) I'm not dead
+> [ 0.020000] (2:Sleeper@Tremblay) catch HostException: Host Failure (null)
+> [ 0.020000] (1:TestRunner@Fafard) Tremblay has been stopped
+> [ 0.320000] (1:TestRunner@Fafard) Test sleep seems ok, cool! (number of Process : 1, it should be 1 (i.e. the Test one))
> [ 0.320000] (0:maestro@) MSG_main finished; Cleaning up the simulation...
add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/xbt)
add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/java)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/java/semaphore)
add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/java/sleep_host_off)
add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/mc)
# teshsuite ones
ADD_TESH(tesh-java-sleep-host-off --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/teshsuite/java ${CMAKE_HOME_DIRECTORY}/teshsuite/java/sleep_host_off/sleep_host_off.tesh)
+ ADD_TESH(tesh-java-semaphore-gc --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/teshsuite/java ${CMAKE_HOME_DIRECTORY}/teshsuite/java/semaphore/semaphore_gc.tesh)
ENDIF()