I've had weird race conditions when using vlock together with s2ram. It
appears suspend to ram wants to switch
VTs, while
vlock hooks into the switch requests and explicitly disables them. So some of
the time, the machine would not suspend, while at other times, vlock wouldn't
be able to acquire the VT.
To solve this, I wrote a simple vlock plugin, which simply clears the lock
mechanism, writes mem to /sys/power/state and later reinstates the locking
mechanism. This plugin is called after all and new. Thus, the screen will
be locked properly before suspending.
Here's my suspend.c:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/* Include this header file to make sure the types of the dependencies
* and hooks are correct. */
#include "vlock_plugin.h"
#include "../src/console_switch.h"
const char *succeeds[] = { "all", "new", NULL };
const char *depends[] = { "all", "new", NULL };
bool vlock_start(void __attribute__ ((__unused__)) **ctx_ptr)
{
int fd;
unlock_console_switch();
if((fd = open("/sys/power/state", O_WRONLY)) != -1) {
if(write(fd, "mem", 3) == -1)
perror("suspend: write");
close(fd);
}
lock_console_switch();
return true;
}
Simply paste it to the vlock modules folder, make suspend.so and copy it to
/usr/lib/vlock/modules. I now invoke it like this:
env VLOCK_PLUGINS="all new suspend" vlock