[rtems-schedsim commit] shell/shared: Add task get/set affinity

Joel Sherrill joel at rtems.org
Wed May 14 14:47:38 UTC 2014


Module:    rtems-schedsim
Branch:    master
Commit:    156cb91355da8cb6255b0a0f754bd561cc7f03b0
Changeset: http://git.rtems.org/rtems-schedsim/commit/?id=156cb91355da8cb6255b0a0f754bd561cc7f03b0

Author:    Joel Sherrill <joel.sherrill at oarcorp.com>
Date:      Wed May 14 09:23:26 2014 -0500

shell/shared: Add task get/set affinity

---

 schedsim/shell/shared/Makefile.am            |    4 +
 schedsim/shell/shared/commands.c             |    8 +++
 schedsim/shell/shared/main_taskgetaffinity.c |   80 ++++++++++++++++++++++++
 schedsim/shell/shared/main_tasksetaffinity.c |   85 ++++++++++++++++++++++++++
 4 files changed, 177 insertions(+), 0 deletions(-)

diff --git a/schedsim/shell/shared/Makefile.am b/schedsim/shell/shared/Makefile.am
index 5b80e65..85b58af 100644
--- a/schedsim/shell/shared/Makefile.am
+++ b/schedsim/shell/shared/Makefile.am
@@ -49,6 +49,10 @@ libschedsim_a_SOURCES += main_taskwakeafter.c
 libschedsim_a_SOURCES += schedsim_disable_dispatch.c
 libschedsim_a_SOURCES += shell_cmdset.c
 libschedsim_a_SOURCES += shell_makeargs.c 
+if HAS_SMP
+libschedsim_a_SOURCES += main_taskgetaffinity.c
+libschedsim_a_SOURCES += main_tasksetaffinity.c
+endif
 
 schedsim_shell_includedir = $(includedir)/schedsim
 schedsim_newlib_includedir = $(includedir)/schedsim/newlib
diff --git a/schedsim/shell/shared/commands.c b/schedsim/shell/shared/commands.c
index af15638..e79cd0b 100644
--- a/schedsim/shell/shared/commands.c
+++ b/schedsim/shell/shared/commands.c
@@ -23,6 +23,10 @@ extern rtems_shell_cmd_t rtems_shell_TASK_PRIORITY_Command;
 extern rtems_shell_cmd_t rtems_shell_TASK_SUSPEND_Command;
 extern rtems_shell_cmd_t rtems_shell_TASK_RESUME_Command;
 extern rtems_shell_cmd_t rtems_shell_TASK_WAKE_AFTER_Command;
+#if RTEMS_SMP
+  extern rtems_shell_cmd_t rtems_shell_TASK_GET_AFFINITY_Command;
+  extern rtems_shell_cmd_t rtems_shell_TASK_SET_AFFINITY_Command;
+#endif
 
 extern rtems_shell_cmd_t rtems_shell_CLOCK_TICK_Command;
 
@@ -50,6 +54,10 @@ rtems_shell_cmd_t *rtems_shell_Initial_commands[] = {
   &rtems_shell_TASK_SUSPEND_Command,
   &rtems_shell_TASK_RESUME_Command,
   &rtems_shell_TASK_WAKE_AFTER_Command,
+  #if RTEMS_SMP
+    &rtems_shell_TASK_GET_AFFINITY_Command,
+    &rtems_shell_TASK_SET_AFFINITY_Command,
+  #endif
 
   &rtems_shell_CLOCK_TICK_Command,
 
diff --git a/schedsim/shell/shared/main_taskgetaffinity.c b/schedsim/shell/shared/main_taskgetaffinity.c
new file mode 100644
index 0000000..3052600
--- /dev/null
+++ b/schedsim/shell/shared/main_taskgetaffinity.c
@@ -0,0 +1,80 @@
+/**
+ *  @file
+ *
+ *  Task Get Affinity Shell Command Implmentation
+ */
+
+/*
+ *  COPYRIGHT (c) 1989-2014.
+ *  On-Line Applications Research Corporation (OAR).
+ *
+ *  The license and distribution terms for this file may be
+ *  found in the file LICENSE in this distribution or at
+ *  http://www.rtems.com/license/LICENSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define _GNU_SOURCE
+#include <sys/cpuset.h>
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_get_affinity(
+  int   argc,
+  char *argv[]
+)
+{
+  rtems_id             id;
+  rtems_status_code    status;
+  unsigned long        tmp;
+  cpu_set_t            cpuset;
+ 
+  CHECK_RTEMS_IS_UP();
+
+  if (argc != 2) {
+    fprintf( stderr, "%s: Usage [name|id]\n", argv[0] );
+    return -1;
+  }
+
+  if ( lookup_task( argv[1], &id ) )
+    return -1;
+
+  CPU_ZERO( &cpuset );
+  cpuset.__bits[0] = tmp;
+
+  /*
+   *  Now obtain the affinity the task
+   */
+  status = rtems_task_get_affinity( id, sizeof(cpuset), &cpuset );
+  if ( status != RTEMS_SUCCESSFUL ) {
+    fprintf(
+      stderr,
+      "Task Get Affinity(%s) returned %s\n",
+      argv[1],
+      rtems_status_text( status )
+    ); 
+    return -1;
+  }
+
+  printf("Task (0x%08x) Get affinity=0x%08x\n", id, cpuset.__bits[0] );
+  
+  return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_GET_AFFINITY_Command = {
+  "task_get_affinity",                 /* name */
+  "task_get_affinity name ",           /* usage */
+  "rtems",                             /* topic */
+  rtems_shell_main_task_get_affinity,  /* command */
+  NULL,                                /* alias */
+  NULL                                 /* next */
+};
diff --git a/schedsim/shell/shared/main_tasksetaffinity.c b/schedsim/shell/shared/main_tasksetaffinity.c
new file mode 100644
index 0000000..5d4eb41
--- /dev/null
+++ b/schedsim/shell/shared/main_tasksetaffinity.c
@@ -0,0 +1,85 @@
+/**
+ *  @file
+ *
+ *  Task Set Affinity Shell Command Implmentation
+ */
+
+/*
+ *  COPYRIGHT (c) 1989-2014.
+ *  On-Line Applications Research Corporation (OAR).
+ *
+ *  The license and distribution terms for this file may be
+ *  found in the file LICENSE in this distribution or at
+ *  http://www.rtems.com/license/LICENSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define _GNU_SOURCE
+#include <sys/cpuset.h>
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_set_affinity(
+  int   argc,
+  char *argv[]
+)
+{
+  rtems_id             id;
+  rtems_status_code    status;
+  unsigned long        tmp;
+  cpu_set_t            cpuset;
+ 
+  CHECK_RTEMS_IS_UP();
+
+  if (argc != 3) {
+    fprintf( stderr, "%s: Usage [name|id] affinity\n", argv[0] );
+    return -1;
+  }
+
+  if ( lookup_task( argv[1], &id ) )
+    return -1;
+
+  if ( rtems_string_to_unsigned_long( argv[2], &tmp, NULL, 0) ) {
+    fprintf( stderr, "Argument (%s) is not a number\n", argv[2] );
+    return 1;
+  }
+
+  CPU_ZERO( &cpuset );
+  cpuset.__bits[0] = tmp;
+
+  /*
+   *  Now change the affinity of the task
+   */
+  status = rtems_task_set_affinity( id, sizeof(cpuset), &cpuset );
+  if ( status != RTEMS_SUCCESSFUL ) {
+    fprintf(
+      stderr,
+      "Task Set Affinity(%s) returned %s\n",
+      argv[1],
+      rtems_status_text( status )
+    ); 
+    return -1;
+  }
+
+  printf("Task (0x%08x) Set affinity=0x%08x\n", id, cpuset.__bits[0] );
+  
+  return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_SET_AFFINITY_Command = {
+  "task_set_affinity",                 /* name */
+  "task_set_affinity name ",           /* usage */
+  "rtems",                             /* topic */
+  rtems_shell_main_task_set_affinity,  /* command */
+  NULL,                                /* alias */
+  NULL                                 /* next */
+};




More information about the vc mailing list