Re: [Vala] Soup.Buffer memory
On Tue, 2013-09-24 at 14:24 +0200, andrea zambon wrote: > I am developing a service http with libsoup, but I have a memory problem. > When you make a request, the service memory increases during transmission > and decreases only after the closure of the service. Another call and will > increase again. See the API docs for Soup.MessageBody.set_accumulate: http://valadoc.org/libsoup-2.4/Soup.MessageBody.set_accumulate.html I have no idea if it will work for encodings other than chunked, but I don't see a reason why you would want to close the connection after every request, so why not just use chunked? > The client is in another machine and the data may be very long (2 GB). > I try to user Soup.MemoryUse.TAKE but I get garbage data. > The Soup.Buffer is not free when sending a new buffer? Using the default Soup.Buffer constructor with Soup.MemoryUse.TAKE is very difficult to get right. That flag is telling libsoup: "The caller has allocated the memory for the SoupBuffer's use; libsoup will assume ownership of it and free it (with g_free()) when it is done with it." However, Vala isn't actually aware of the interaction between this parameter and libsoup's memory management. According to the bindings, the argument does not transfer ownership, which means Vala will free the buffer for you, then it is likely to get reallocated somewhere else and have its contents changed. Furthermore, when libsoup tries to free it your program will likely crash. If you want to transfer ownership, you should use the Soup.Buffer.take constructor. By default valac will actually make a copy of the buffer for you, so if you want to pass along your reference (which will invalidate your local copy), use the (owned) keyword: var buffer = new Soup.Buffer.take ((owned) data); I'm attaching a version of a server I wrote a while back which you may want to take a look at. It uses chunked encoding for larger files, while smaller files are mmaped and use content length encoding. It's also pretty good about doing things asynchronously when possible. -Evan public class Server : Soup.Server { public string directory { get; construct; } private const int BUFFER_SIZE = 1024 * 1024; private void write_chunk (Soup.Message msg) { unowned GLib.InputStream stream = msg.get_data ("input-stream"); uint8[] buffer = new uint8[BUFFER_SIZE]; stream.read_async.begin (buffer, GLib.Priority.DEFAULT, null, (obj, res) => { try { buffer.length = (int) stream.read_async.end (res); if (buffer.length > 0) { msg.response_body.append_take ((owned) buffer); } else { msg.response_body.complete (); } } catch (GLib.Error e) { GLib.warning (e.message); msg.response_body.complete (); } this.unpause_message (msg); }); } private async void handle_async (Soup.Server server, Soup.Message msg, string path, GLib.HashTable? query, Soup.ClientContext client) { string filename = GLib.Path.build_filename (directory, path); GLib.File file = GLib.File.new_for_path (filename); GLib.FileInputStream stream; uint64 content_length = 0; this.pause_message (msg); try { GLib.FileInfo info = file.query_info ( string.joinv (",", { GLib.FileAttribute.STANDARD_SIZE, GLib.FileAttribute.STANDARD_CONTENT_TYPE }), 0); content_length = info.get_attribute_uint64 (GLib.FileAttribute.STANDARD_SIZE); msg.response_headers.append ("Content-type", info.get_attribute_as_string (GLib.FileAttribute.STANDARD_CONTENT_TYPE)); stream = yield file.read_async (); } catch (GLib.Error e) { bool e_handled = false; if (e is GLib.IOError) { if (e is GLib.IOError.NOT_FOUND) { msg.set_status (Soup.Status.NOT_FOUND); e_handled = true; } } if (!e_handled) { msg.set_status (Soup.Status.INTERNAL_SERVER_ERROR); } msg.response_headers.append ("Content-type", "text/html"); string reason = GLib.Markup.escape_text (msg.reason_phrase); msg.response_body.append (Soup.MemoryUse.COPY, "%s%s\n".printf (reason, reason).data); this.unpause_message (msg); return; } msg.set_status (Soup.Status.OK); if (content_length > 0 && content_length < BUFFER_SIZE) { try { GLib.MappedFile mapped = new GLib.MappedFile (filename, false); unowned uint8[] data = (uint8[]) mapped.get_contents (); data.length = (int) mapped.get_length (); msg.response_headers.set_encoding (Soup.Encoding.CONTENT_LENGTH); msg.response_body.append (Soup.MemoryUse.TEMPORARY, data); /* This will keep the mapped file alive until the message is * destroyed, which allows us to use Soup.MemoryUse.TEMPORARY * above and avoid a copy. */ msg.set_data ("memory-mapped-file", (owned) mapped); this.un
[Vala] Fw: Extra documentation for vapis on Valadoc
From: Steven Oliver >To: vala-list >Sent: Tuesday, 24 September 2013, 19:15 >Subject: [Vala] Extra documentation for vapis on Valadoc > > >My question is how did the extra documentation get there? I looked in the >Glib-2.0 vapi but there's nothing extra there. > My understanding is Valadoc is not generated from vapi files. It has it's own markup style ( see http://valadoc.org/#!wiki=markup ) and source code ( see https://gitorious.org/valadoc-org/valadoc-org/ ), but that may not be the whole story because the relevant valadoc file I can find ( https://gitorious.org/valadoc-org/valadoc-org/source/6c7d58e17a247438337d75bde80737f0e539fa2b:documentation/glib-2.0/glib-2.0.valadoc ) doesn't seem to contain the GLib.Markup.printf_escaped function you were interested in. Hope that helps, Al ___ vala-list mailing list vala-list@gnome.org https://mail.gnome.org/mailman/listinfo/vala-list
[Vala] [ANNOUNCE] Libgee 0.12.0 - GObject collection library
We are very pleased to announce version 0.12.0 of Libgee, the GObject collection library. Libgee 0.12.0 is now available for download at: http://download.gnome.org/sources/libgee/0.12/ Also please note that now Libgee has its own mailing-list http://mail.gnome.org/mailman/listinfo/libgee-list and its own #gee IRC channel. New in 0.12.0 - * No changes from beta Libgee is a collection library providing GObject-based interfaces and classes for commonly used data structures. Libgee provides the following interfaces: * Traversable o Iterable + Collection # List * BidirList # Set * SortedSet o BidirSortedSet # MultiSet # Queue * Deque + Map # SortedMap * BidirSortedMap o Iterator + BidirIterator # BidirListIterator + ListIterator # BidirListIterator * MultiMap * Future The ArrayList, ArrauQueue, ConcurrentLinkedList, ConcurrentSet, HashSet, HashMap, HashMultiSet, HashMultiMap, LinkedList, PriorityQueue, Promise, TreeSet, TreeMap, TreeMultiSet, and TreeMultiMap classes provide a reasonable sample implementation of those interfaces. In addition, a set of abstract classes are provided to ease the implementation of new collections. Around that, the API provide means to retrieve read-only views, efficient sort algorithms, simple, bi-directional or index-based mutable iterators depending on the collection type. Libgee is written in Vala and can be used like any GObject-based C library. It's planned to provide bindings for further languages. More information about Vala is available at http://live.gnome.org/Libgee Maciej Marcin Piechotka ___ vala-list mailing list vala-list@gnome.org https://mail.gnome.org/mailman/listinfo/vala-list
[Vala] Extra documentation for vapis on Valadoc
I was looking through Valadoc.org today and came across this entry: http://valadoc.org/#!api=glib-2.0/GLib.Markup.printf_escaped My question is how did the extra documentation get there? I looked in the Glib-2.0 vapi but there's nothing extra there. https://git.gnome.org/browse/vala/tree/vapi/glib-2.0.vapi#n3553 Steven N. Oliver ___ vala-list mailing list vala-list@gnome.org https://mail.gnome.org/mailman/listinfo/vala-list
Re: [Vala] How to convert a string to float ?
Ok ehm.. I've searched in the wrong place it seems... sorry. :) Thanks > > > > > >> >> From: "r...@no-log.org" >>To: vala-list@gnome.org >>Sent: Tuesday, 24 September 2013, 13:36 >>Subject: [Vala] How to convert a string to float ? >> >> >>To convert a string to int : int.parse >>ok, easy... >> >>Try double.parse() > > For more see https://wiki.gnome.org/Vala/Tutorial#Strings > > Al > ___ > vala-list mailing list > vala-list@gnome.org > https://mail.gnome.org/mailman/listinfo/vala-list > ___ vala-list mailing list vala-list@gnome.org https://mail.gnome.org/mailman/listinfo/vala-list
Re: [Vala] How to convert a string to float ?
> > From: "r...@no-log.org" >To: vala-list@gnome.org >Sent: Tuesday, 24 September 2013, 13:36 >Subject: [Vala] How to convert a string to float ? > > >To convert a string to int : int.parse >ok, easy... > >Try double.parse() For more see https://wiki.gnome.org/Vala/Tutorial#Strings Al ___ vala-list mailing list vala-list@gnome.org https://mail.gnome.org/mailman/listinfo/vala-list
[Vala] How to convert a string to float ?
Hello, Just as I said in subject of this mail, I'm trying to convert a string into a float. To convert a string to int : int.parse ok, easy... Float... ehm.. no atof function, I've seen a lot of things about "Value" so I've tried and I've got " GLib-GObject-CRITICAL **: g_value_set_***"... So how can I convert ? Sample code : Value val = Value (typeof (double)); val.set_string("3.4"); // < error stdout.printf ("get_double()\n"); stdout.printf ("%f\n", val.get_double()); stdout.printf ("get_string()\n"); stdout.printf ("%s\n", val.get_string()); // <-- error Value val2 = Value (typeof (string)); val2.set_string("3.4"); stdout.printf ("get_double()\n"); stdout.printf ("%f\n", val2.get_double()); // <-- error stdout.printf ("get_string()\n"); stdout.printf ("%s\n", val2.get_string()); OUTPUT : --- (spawn.exe:4056): GLib-GObject-CRITICAL **: g_value_set_string: assertion `G_VALUE_HOLDS_STRING (value)' failed get_double() 0.00 get_string() (spawn.exe:4056): GLib-GObject-CRITICAL **: g_value_get_string: assertion `G_VALUE_HOLDS_STRING (value)' failed (null) get_double() (spawn.exe:4056): GLib-GObject-CRITICAL **: g_value_get_double: assertion `G_VALUE_HOLDS_DOUBLE (value)' failed 0.00 get_string() 3.4 --- Thanks Regards Raum ___ vala-list mailing list vala-list@gnome.org https://mail.gnome.org/mailman/listinfo/vala-list
[Vala] Soup.Buffer memory
I am developing a service http with libsoup, but I have a memory problem. When you make a request, the service memory increases during transmission and decreases only after the closure of the service. Another call and will increase again. The client is in another machine and the data may be very long (2 GB). I try to user Soup.MemoryUse.TAKE but I get garbage data. The Soup.Buffer is not free when sending a new buffer? Thank you for suggestion. public static int main(string[] args) { Soup.Server server = new Soup.Server (Soup.SERVER_PORT, 12345); server.add_handler ("/data", default_handler); server.run(); return 0; } void default_handler (Soup.Server server, Soup.Message msg, string path, GLib.HashTable? query, Soup.ClientContext client) { r = new Reader(); msg.response_headers.set_encoding(Soup.Encoding.EOF); msg.response_headers.append("Content-Type", "text/html" ); msg.set_status(Soup.KnownStatusCode.OK); if (msg.method == "GET") { msg.wrote_headers.connect(write_next_chunk); msg.wrote_chunk.connect(write_next_chunk); } } public void write_next_chunk(Soup.Message msg){ Soup.Buffer b = r.GetBuffer(); msg.response_body.append_buffer (b); } Reader r; public class Reader { public Soup.Buffer GetBuffer() { uint8[] b = {'a','b','c','d','e','f','g','h','i','l' }; return new Soup.Buffer(Soup.MemoryUse.COPY, s.data); } } ___ vala-list mailing list vala-list@gnome.org https://mail.gnome.org/mailman/listinfo/vala-list
Re: [Vala] Emendo text editor
On Mon, Sep 23, 2013 at 8:15 PM, simargl wrote: > Hi, > > Emendo is a simple text editor with syntax highlighting written in Vala, > using Gtk+3 and Gtksourceview. If someone is interested source tarball can > be found here:http://alphaos.tuxfamily.org/forum/viewtopic.php?f=8&t=702#p1151 > > Presenting this text editor to you is one thing, but more important there > are two known bugs I am still not able to solve: > > First, before closing program from toolbar or with Ctrl+Q, there is > source_buffer_check method called (line 700) from action_quit (line 573) > method, that offers to save changes if source buffer is modified. That > works fine if program is closing from toolbar button or Ctrl+Q, but when X > in titlebar is clicked, program first closes then shows that dialog box and > offers to save changes. > > Second, replace_all method (line 545) works OK, but it is not undoable, > when undo button from toolbar is clicked, everything from sourcebuffer gets > deleted. > > Thank you for any help. > Solved not undoable replace_all with adding two lines: source_buffer.begin_user_action(); and source_buffer.end_user_action(); .. private void replace_all() { string search_string = replace_search_entry.text; string replace_string = replace_entry.text; Gtk.TextSearchFlags flags = Gtk.TextSearchFlags.TEXT_ONLY; Gtk.TextIter start_iter, match_start, match_end; source_buffer.get_start_iter (out start_iter); while (start_iter.forward_search (search_string, flags, out match_start, out match_end, null)) { source_buffer.begin_user_action(); source_buffer.@delete (ref match_start, ref match_end); source_buffer.insert (ref match_start, replace_string, replace_string.length); start_iter = match_start; source_view.scroll_to_iter (start_iter, 0.10, false, 0, 0); source_buffer.end_user_action(); } } ___ vala-list mailing list vala-list@gnome.org https://mail.gnome.org/mailman/listinfo/vala-list