Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
bummer. Let's add all the needed files to the svn (sorry)
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 23 Mar 2010 13:15:13 +0000 (13:15 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 23 Mar 2010 13:15:13 +0000 (13:15 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7317 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/simix/smx_context_base.c [new file with mode: 0644]

diff --git a/src/simix/smx_context_base.c b/src/simix/smx_context_base.c
new file mode 100644 (file)
index 0000000..1cce400
--- /dev/null
@@ -0,0 +1,78 @@
+/* context_base - Code factorization accross context switching implementations */
+
+/* Copyright (c) 2010 the SimGrid team. All right 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. */
+
+
+#include "xbt/function_types.h"
+#include "private.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(bindings);
+
+void smx_ctx_base_factory_init(smx_context_factory_t * factory) {
+  /* instantiate the context factory */
+  *factory = xbt_new0(s_smx_context_factory_t, 1);
+
+  (*factory)->create_context = NULL;
+  (*factory)->finalize = smx_ctx_base_factory_finalize;
+  (*factory)->free = smx_ctx_base_free;
+  (*factory)->stop = smx_ctx_base_stop;
+  (*factory)->suspend = NULL;
+  (*factory)->resume = NULL;
+
+  (*factory)->name = "base context factory";
+}
+
+int smx_ctx_base_factory_finalize(smx_context_factory_t * factory) {
+  free(*factory);
+  *factory = NULL;
+  return 0;
+}
+
+smx_context_t
+smx_ctx_base_factory_create_context_sized(size_t size,
+    xbt_main_func_t code, int argc, char** argv,
+    void_f_pvoid_t cleanup_func, void* cleanup_arg)
+{
+  smx_context_t context = xbt_malloc0(size);
+
+  /* If the user provided a function for the process then use it
+     otherwise is the context for maestro */
+  if(code){
+    context->cleanup_func = cleanup_func;
+    context->cleanup_arg = cleanup_arg;
+    context->argc = argc;
+    context->argv = argv;
+    context->code = code;
+  }
+    
+  return context;
+}
+
+void smx_ctx_base_free(smx_context_t context) {
+  int i;
+
+  if (context) {
+
+    /* free argv */
+    if (context->argv) {
+      for (i = 0; i < context->argc; i++)
+        if (context->argv[i])
+          free(context->argv[i]);
+
+      free(context->argv);
+    }
+
+    /* free structure */
+    free(context);
+  }
+} 
+
+void smx_ctx_base_stop(smx_context_t context) {
+
+  if (context->cleanup_func)
+    (*(context->cleanup_func)) (context->cleanup_arg);
+
+}