Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
462f9a271134b599edae247448d3284a7a812db2
[simgrid.git] / src / bindings / java / JavaContext.hpp
1 /* Context switching within the JVM.                                        */
2
3 /* Copyright (c) 2009-2018. The SimGrid Team. All rights reserved.          */
4
5 /* This program is free software; you can redistribute it and/or modify it
6  * under the terms of the license (GNU LGPL) which comes with this package. */
7
8 #ifndef SIMGRID_JAVA_JAVA_CONTEXT_HPP
9 #define SIMGRID_JAVA_JAVA_CONTEXT_HPP
10
11 #include <functional>
12 #include <jni.h>
13
14 #include "simgrid/simix.h"
15 #include "src/simix/smx_private.hpp"
16 #include "xbt/xbt_os_thread.h"
17
18 #include "jmsg.hpp"
19
20 namespace simgrid {
21 namespace kernel {
22 namespace context {
23
24 class JavaContext;
25 class JavacontextFactory;
26
27 class JavaContext : public simgrid::kernel::context::Context {
28 public:
29   // The java process instance bound with the msg process structure:
30   jobject jprocess = nullptr;
31   // JNI interface pointer associated to this thread:
32   JNIEnv *jenv = nullptr;
33   xbt_os_thread_t thread = nullptr;
34   // Sempahore used to schedule/yield the process:
35   xbt_os_sem_t begin = nullptr;
36   // Semaphore used to schedule/unschedule the process:
37   xbt_os_sem_t end = nullptr;
38
39   friend class JavaContextFactory;
40   JavaContext(std::function<void()> code,
41           void_pfn_smxprocess_t cleanup_func,
42           smx_actor_t process);
43   ~JavaContext() override;
44   void stop() override;
45   void suspend() override;
46   void resume();
47 private:
48   static void* wrapper(void *data);
49 };
50
51 class JavaContextFactory : public simgrid::kernel::context::ContextFactory {
52 public:
53   JavaContextFactory();
54   ~JavaContextFactory() override;
55   JavaContext* self() override;
56   JavaContext* create_context(std::function<void()> code,
57     void_pfn_smxprocess_t, smx_actor_t process) override;
58   void run_all() override;
59 };
60
61 XBT_PRIVATE simgrid::kernel::context::ContextFactory* java_factory();
62 XBT_PRIVATE void java_main_jprocess(jobject process);
63
64 }}} // namespace simgrid::kernel::context
65
66 #endif                          /* !_XBT_CONTEXT_JAVA_H */