lintian doesn't like orphan packages with uploaders...
[debian/amanda] / device-src / device.h
index 57f6b37573eeeadf8f7e2e5e529d02b3022267a4..f53ca001f975ef0f2d9cc8099f2abfee70683e74 100644 (file)
@@ -1,9 +1,10 @@
 /*
- * Copyright (c) 2007, 2008, 2009, 2010 Zmanda, Inc.  All Rights Reserved.
+ * Copyright (c) 2007-2012 Zmanda, Inc.  All Rights Reserved.
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -91,6 +92,11 @@ typedef struct Device {
     /* You can peek at the stuff below, but only subclasses should
        change these values.*/
 
+    /* A mutex to protect field accessed from another thread.
+     * Only get_bytes_read and get_bytes_written are allowed from another
+     * Only in_file, bytes_read and bytes_written are protected */
+    GMutex  *device_mutex;
+
     /* What file, block are we at? (and are we in the middle of a file?) */
     int file;
     guint64 block;
@@ -134,6 +140,9 @@ typedef struct Device {
     gsize block_size;
     gsize header_block_size;
 
+    guint64 bytes_read;
+    guint64 bytes_written;
+
     /* surety and source for the block size; if you set block_size directly,
      * set these, too! */
     PropertySurety block_size_surety;
@@ -193,15 +202,30 @@ struct _DeviceClass {
     gboolean (* erase) (Device * self);
     gboolean (* eject) (Device * self);
     gboolean (* finish) (Device * self);
+    guint64  (* get_bytes_read) (Device * self);
+    guint64  (* get_bytes_written) (Device * self);
 
     gboolean (* listen)(Device *self, gboolean for_writing, DirectTCPAddr **addrs);
-    gboolean (* accept)(Device *self, DirectTCPConnection **conn,
-                       ProlongProc prolong, gpointer prolong_data);
-    gboolean (* connect)(Device *self, gboolean for_writing, DirectTCPAddr *addrs,
-                       DirectTCPConnection **conn, ProlongProc prolong,
-                       gpointer prolong_data);
-    gboolean (* write_from_connection)(Device *self, guint64 size, guint64 *actual_size);
-    gboolean (* read_to_connection)(Device *self, guint64 size, guint64 *actual_size);
+    /* The MainLoop must be running, but the following 4 methods must not be
+     * called from an event. they must be called from a different thread.
+     * They return:
+     *   0 - success
+     *   1 - failed
+     *   2 - interupted
+     */
+    int (* accept)(Device *self, DirectTCPConnection **conn,
+                       int *cancelled, GMutex *abort_mutex, GCond *abort_cond);
+    int (* connect)(Device *self, gboolean for_writing,
+                       DirectTCPAddr *addrs, DirectTCPConnection **conn,
+                       int *cancelled,
+                       GMutex *abort_mutex, GCond *abort_cond);
+    int (* write_from_connection)(Device *self, guint64 size,
+                       guint64 *actual_size, int *cancelled,
+                       GMutex *abort_mutex, GCond *abort_cond);
+    int (* read_to_connection)(Device *self, guint64 size,
+                       guint64 *actual_size, int *cancelled,
+                       GMutex *abort_mutex, GCond *abort_cond);
+
     gboolean (* use_connection)(Device *self, DirectTCPConnection *conn);
 
     /* array of DeviceProperty objects for this class, keyed by ID */
@@ -294,6 +318,8 @@ gboolean    device_start    (Device * self,
                                  DeviceAccessMode mode, char * label,
                                  char * timestamp);
 gboolean       device_finish   (Device * self);
+guint64        device_get_bytes_read   (Device * self);
+guint64        device_get_bytes_written(Device * self);
 gboolean        device_start_file       (Device * self,
                                          dumpfile_t * jobInfo);
 gboolean       device_write_block      (Device * self,
@@ -329,13 +355,18 @@ gboolean  device_eject    (Device * self);
 
 #define device_directtcp_supported(self) (DEVICE_GET_CLASS((self))->directtcp_supported)
 gboolean device_listen(Device *self, gboolean for_writing, DirectTCPAddr **addrs);
-gboolean device_accept(Device *self, DirectTCPConnection **conn,
-                ProlongProc prolong, gpointer prolong_data);
-gboolean device_connect(Device *self, gboolean for_writing, DirectTCPAddr *addrs,
-                       DirectTCPConnection **conn, ProlongProc prolong,
-                       gpointer prolong_data);
-gboolean device_write_from_connection(Device *self, guint64 size, guint64 *actual_size);
-gboolean device_read_to_connection(Device *self, guint64 size, guint64 *actual_size);
+int device_accept(Device *self, DirectTCPConnection **conn,
+                       int *cancelled, GMutex *abort_mutex, GCond *abort_cond);
+int device_connect(Device *self, gboolean for_writing,
+                       DirectTCPAddr *addrs, DirectTCPConnection **conn,
+                       int *cancelled,
+                       GMutex *abort_mutex, GCond *abort_cond);
+int device_write_from_connection(Device *self, guint64 size,
+                       guint64 *actual_size, int *cancelled,
+                       GMutex *abort_mutex, GCond *abort_cond);
+int device_read_to_connection(Device *self, guint64 size,
+                       guint64 *actual_size, int *cancelled,
+                       GMutex *abort_mutex, GCond *abort_cond);
 gboolean device_use_connection(Device *self, DirectTCPConnection *conn);
 
 /* Protected methods. Don't call these except in subclass implementations. */