I've included in the vala posix vapi all the scheduler functions
provided by sched.h.

A simple usage, could be for example this code (which shows the number
of CPUs that you have):

/* Compile with valac --pkg posix test-posix-sched.vala -v -X -D"_GNU_SOURCE" */

using Posix;

int get_cpu_count() {
        int count = 0;

        var cpus = new Posix.CpuSet();
        var size = cpus.alloc_size();
        cpus.zero_sized(size);
        cpus.getaffinity(size);
        count = cpus.count_sized(size);

        return (count <= 0) ? 1 : count;
}

int main(string[] args) {
        print(@"Your PC has $(get_cpu_count()) CPUs\n");

        return 0;
}

(Maybe this get_cpu_count() function could be added to the vapi itself,
for getting the number of CPUs for multi-threading apps using, for
example a ThreadPool or just to limit Thread creation...)

Bye.
From 07182b6477f78d547f61babf83c835a04d704402 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marco=20Trevisan=20(Trevi=C3=B1o)?= <[email protected]>
Date: Tue, 4 Jan 2011 01:19:46 +0100
Subject: [PATCH] Posix: added sched_ functions support

Scheduler functions included
---
 vapi/posix.vapi |  121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 121 insertions(+), 0 deletions(-)

diff --git a/vapi/posix.vapi b/vapi/posix.vapi
index 260f66a..8831e54 100644
--- a/vapi/posix.vapi
+++ b/vapi/posix.vapi
@@ -1,6 +1,7 @@
 /* posix.vapi
  *
  * Copyright (C) 2008-2009  Jürg Billeter
+ * Copyright (C) 2010 Marco Trevisan (Treviño)
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -18,6 +19,7 @@
  *
  * Author:
  * 	Jürg Billeter <[email protected]>
+ *  Marco Trevisan (Treviño) <[email protected]>
  */
 
 #if POSIX
@@ -2157,5 +2159,124 @@ namespace Posix {
 	public static FILE stderr;
 	public static FILE stdout;
 	public static FILE stdin;
+
+	[CCode(cheader_filename = "sched.h", cprefix = "sched_")]
+	namespace Sched {
+		[SimpleType]
+		[CCode (cname = "struct sched_param")]
+		public struct Param {
+			public int sched_priority;
+		}
+
+		public static int setparam(Posix.pid_t pid, ref Sched.Param param);
+		public static int getparam(Posix.pid_t pid, out Sched.Param param);
+
+		public static int setscheduler(Posix.pid_t pid, Algorithm policy, ref Sched.Param param);
+		public static Algorithm getscheduler(Posix.pid_t pid);
+
+		public static int @yield();
+
+		public static int get_priority_max(int algorithm);
+		public static int get_priority_min(int algorithm);
+
+		public static int rr_get_interval(Posix.pid_t pid, out Posix.timespec? interval);
+
+		[CCode (cprefix = "SCHED_", cname = "int")]
+		public enum Algorithm {
+			OTHER,
+			FIFO,
+			RR,
+			BATCH,
+			IDLE
+		}
+	}
+
+	[Compact]
+	[CCode(cheader_filename = "sched.h", cname = "cpu_set_t", free_function = "CPU_FREE", copy_function="memcpy")]
+	public class CpuSet {
+		[CCode(cname = "CPU_ALLOC")]
+		public CpuSet(int num = 1);
+
+		[CCode(cname = "CPU_ALLOC_SIZE")]
+		public static size_t alloc_size(int num = 1);
+
+		[CCode(cname = "CPU_SETSIZE")]
+		public static size_t size;
+
+		[CCode(cname = "CPU_COUNT")]
+		public int count();
+
+		[CCode(cname = "CPU_COUNT_S", instance_pos = -1)]
+		public int count_sized(size_t num);
+
+		[CCode(cname = "CPU_ZERO")]
+		public void zero();
+
+		[CCode(cname = "CPU_ZERO_S", instance_pos = -1)]
+		public void zero_sized(size_t num);
+
+		[CCode(cname = "CPU_SET", instance_pos = -1)]
+		public void @set(int cpu);
+
+		[CCode(cname = "CPU_SET_S", instance_pos = -1)]
+		public void @set_sized(int cpu, size_t num);
+
+		[CCode(cname = "CPU_CLR", instance_pos = -1)]
+		public void clr(int cpu);
+
+		[CCode(cname = "CPU_CLR_S", instance_pos = -1)]
+		public void clr_sized(int cpu, size_t num);
+
+		[CCode(cname = "CPU_ISSET", instance_pos = -1)]
+		public bool is_set(int cpu);
+
+		[CCode(cname = "CPU_ISSET_S", instance_pos = -1)]
+		public bool is_set_sized(int cpu, size_t num);
+
+		[CCode(cname = "CPU_EQUAL")]
+		public static bool equal(CpuSet cs1, CpuSet cs2);
+
+		public bool is_equal(CpuSet cs) {
+			return CpuSet.equal(this, cs);
+		}
+
+		[CCode(cname = "CPU_EQUAL_S", instance_pos = -1)]
+		public static bool equal_sized(size_t num, CpuSet cs1, CpuSet cs2);
+
+		public bool is_equal_sized(size_t num, CpuSet cs) {
+			return CpuSet.equal_sized(num, this, cs);
+		}
+
+		[CCode(cname = "CPU_AND", instance_pos = -1)]
+		public void and(CpuSet destset, CpuSet srcset);
+
+		[CCode(cname = "CPU_AND_S", instance_pos = -1)]
+		public void and_sized(size_t num, CpuSet destset, CpuSet srcset);
+
+		[CCode(cname = "CPU_OR", instance_pos = -1)]
+		public void or(CpuSet destset, CpuSet srcset);
+
+		[CCode(cname = "CPU_OR_S", instance_pos = -1)]
+		public void or_sized(size_t num, CpuSet destset, CpuSet srcset);
+
+		[CCode(cname = "CPU_XOR", instance_pos = -1)]
+		public void xor(CpuSet destset, CpuSet srcset);
+
+		[CCode(cname = "CPU_XOR_S", instance_pos = -1)]
+		public void xor_sized(size_t num, CpuSet destset, CpuSet srcset);
+
+		[CCode(cname = "sched_setaffinity", instance_pos = -1)]
+		public int setaffinity(size_t num, [CCode(pos = 0)]Posix.pid_t pid = 0);
+
+		[CCode(cname = "sched_getaffinity", instance_pos = -1)]
+		public int getaffinity(size_t num, [CCode(pos = 0)]Posix.pid_t pid = 0);
+
+		public static CpuSet init(int num = 1) {
+			CpuSet cpus = new CpuSet(num);
+			var size = cpus.alloc_size(num);
+			cpus.zero_sized(size);
+			return cpus;
+		}
+	}
 }
 
-- 
1.7.1

_______________________________________________
vala-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to